8 Cập nhật hệ thống
8.2.3 Hiện thực việc cập nhật tình trạng giao thông
Sau khi đã hoàn tất việc chọn các vị trí mà mình muốn cập nhật tình trạng giao thông trên bản đồ ở phần trước, đến đây admin sẽ cần phải cung cấp dữ liệu giao thông cho các vị trí này và hoàn thành việc cập nhật. Cụ thể, như hình 8.24, admin sẽ phải điền form để cung cấp một số thông tin giao thông về khu vực hay đoạn đường mình đã chọn, form này có các trường sau:
• Tốc độ hiện tại: Đây là một trường bắt buộc, thể hiện tốc độ của dòng xe
đang lưu thông trong khu vực hay đoạn đường được chọn (đơn vị là km/h).
• Khoảng thời gian hiệu lực: Đây là một trường bắt buộc, thể hiện khoảng thời gian mà tình trạng giao thông do admin cập nhật có hiệu lực (đơn vị là phút).
• Mô tả: Cho phép admin thêm mô tả cho cập nhật của mình.
• Nguyên nhân: Cho phép admin chọn nguyên nhân dẫn đến tình trạng trên.
Hình 8.17: Ảnh minh họa cho form điền thông tin giao thông của admin
Tất cả dữ liệu mà admin đã chọn bao gồm dữ liệu tọa độ địa lý <latitude,
longitude> của các vị trí đã chọn trên bản đồ và dữ liệu nhập từ form sẽ được ứng dụng web thu thập sau đó gửi về server thông qua API để thực hiện việc cập nhật tình trạng giao thông. API này có định dạng như sau:
• METHOD: POST
• ENDPOINT: https://api.bktraffic.com/api/admin-utraffic/traffic-status
• AUTHENTICATION: Utraffic admin
• BODY: JSON Object chứa các trường được xem là dữ liệu dùng để cập nhật
– type (rectangle|circle|line): Mô tả request của người dùng đang yêu cầu cập nhật tình trạng giao thông theo khu vực hình chữ nhật, khu vực hình tròn hay là đoạn một đoạn đường.
– coordinates (Array): Tập hợp các cặp tọa độ <lat,lng> của các điểm để xác định vị trí cập nhật tình trạng giao thông. Đối với trường hợp vị trí cập nhật là hình chữ nhật thì trường này bao gồm tọa độ 2 điểm thuộc 1 đường chéo bất kì của hình chữ nhật, trong trường hợp vị trí cập nhật là hình tròn thì trường này bao gồm tọa độ của tâm hình tròn, cuối cùng trong trường hợp vị trí cập nhật là đoạn đường thì trường này bao gồm tọa độ của 2 điểm đầu cuối thuộc đoạn đường đó.
– velocity (Number): Tốc độ ước lượng của dòng xe lưu thông trên khu vực hay đoạn đường muốn cập nhật. Giá trị chấp nhận từ 1 km/h đến 40 km/h.
– active_time (Number): Thời gian các cập nhật này có hiệu lực. Giá trị chấp nhận từ 10 phút đến 60 phút.
– description (String): Mô tả sơ lược về cập nhật này.
– cause (String): Nguyên nhân dẫn đến tình trạng cập nhật này.
– radius (Number): Bán kính khu vực cập nhật dữ liệu, chỉ áp dụng cho trường hợp khu vực chọn là hình tròn. Giá trị chấp nhận từ 100m đến 2000m.
• RESPONSE: JSON Object chứa thông tin mô tả việc cập nhật tình trạng
giao thông thành công hay thất bại.
Chi tiết quá trình cập nhật tình trạng giao thông sau khi tiếp nhận request từ phía admin của hệ thống được chúng tôi thực hiện qua các bước sau:
1. Xác định tất cả các segment từ collection Segments được lưu trữ trong cơ
sở dữ liệu cần được cập nhật tình trạng giao thông. Việc này có thể thực hiện
được vì collection này đã được đánh chỉ mục 2dsphere giúp hỗ trợ truy vấn
theo không gian địa lý. Với từng trường type khác nhau được gửi đến chúng
tôi sẽ có cách truy xuất ra tập các segment này khác nhau.
Đầu tiên khi xét đến trường hợp trường typecó giá trị là rectangle thì khi đó chúng tôi sẽ nhận được giá trị của coordinates là tọa độ của hai điểm thuộc một đường chéo của hình chữ nhật. Từ giá trị này chúng tôi sẽ suy ra được tọa độ của 4 điểm thuộc 4 cạnh của hình chữ nhật, giả sử 4 điểm này lần lượt là A, B, C và D. Sau khi đã có toạ độ các điểm này chúng tôi sẽ sử dụng
các toán tử là $geoIntersects và $geometry của MongoDB để thực hiện
việc truy vấn các segment trong khu vực này từ collection Segments. Kết
quả của đoạn truy vấn số 8.1 kế tiếp đây sẽ là tập hợp tất cả các segment có polyline (đây là trường lưu giá trị tọa độ địa lý của 2 điểm đầu cuối của một
segment, trường này đã được đánh chỉ mục 2dsphere) thuộc khu vực hình chữ
1 { 2 polyline = { 3 $ g e o I n t e r s e c t s: { 4 $ ge om et r y: { 5 type: 'Polygon', 6 c o o r d i n a t e s: [ 7 [l a t i t u d e _ A, l o n g i t u d e _ A], 8 [l a t i t u d e _ B, l o n g i t u d e _ B], 9 [l a t i t u d e _ C, l o n g i t u d e _ C], 10 [l a t i t u d e _ D, l o n g i t u d e _ D], 11 [l a t i t u d e _ A, l o n g i t u d e _ A] 12 ], 13 } 14 }, 15 } 16 } 17
Listing 8.1: Truy vấn các segment có tọa độ (polyline) nằm trong khu vực hình chữ nhật
Tiếp đến khi xét đến trường hợp trường type có giá trị là circle thì khi đó chúng tôi sẽ nhận được giá trị củacoordinateslà tọa độ của tâm hình tròn và sẽ nhận thêm giá trị của radiuslà bán kính của hình tròn. Chúng tôi sử dụng
các toán tử là $nearSphere, $geometry, $minDistance, $maxDistance
của MongoDB để thực hiện việc truy vấn các segment trong khu vực này từ
collection Segments. Đoạn truy vấn số 8.2 có ý nghĩa sẽ tìm ra tất cả các
segment thuộc khu vực hình tròn có tọa độ tâm và bán kính đã được xác định
trước đó. 1 { 2 polyline = { 3 $ n e a r S p h e r e: { 4 $ ge om et r y: { 5 type: 'Point', 6 c o o r d i n a t e s: [ 7 l a t i t u d e _ c e n t e r, l o n g i t u d e _ c e n t e r 8 ], 9 }, 10 $ m i n D i s t a n c e: 0, 11 $ m a x D i s t a n c e: radius, 12 }, 13 } 14 } 15
Listing 8.2: Truy vấn các segment có tọa độ (polyline) nằm trong khu vực hình tròn với bán kính đã xác định
Cuối cùng khi xét đến trường hợp type có giá trị là line thì khi đó chúng tôi
sẽ nhận được giá trị của coordinates là tọa độ của 2 điểm đầu cuối của một