Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
1
VIETBANDO DATAWAREHOUSE TOTAL SOLUTIONS – VDTS
OUTLINE
PHẦN MỀM HỆ THỐNG TRUNG TÂM THÔNG TIN CHỈ HUY
-VBD T4CH-
2
MỤC LỤC
PHẦN I. GIỚI THIỆU.......................................................................................................................... 4
PHẦN II. KIẾN TRÚC HỆ THỐNG ..................................................................................................... 4
1. LỚP CƠ SỞ HẠ TẦNG ................................................................................................................ 5
2. LỚP DỮ LIỆU ........................................................................................................................... 6
3. LỚP ỨNG DỤNG ....................................................................................................................... 6
4. LỚP LIÊN LẠC .......................................................................................................................... 6
5. LỚP NGƯỜI DÙNG ..................................................................................................................... 6
PHẦN III. BỐ TRÍ VÀ THIẾT KẾ MẠNG LƯỚI ................................................................................. 7
PHẦN IV. CẤU TRÚC CHỨC NĂNG VBD T4CH................................................................................ 8
PHẦN V. CÁC CHỨC NĂNG CHÍNH................................................................................................ 11
1. DỄ DÀNG TRIỂN KHAI VÀ BẢO TRÌ .............................................................................................. 11
2. TÍCH HỢP VỚI TRUNG TÂM TIẾP NHẬN SỰ CỐ QUA ĐIỆN THOẠI ................................................... 11
3. CHIA SẺ THÔNG TIN HIỆU QUẢ ................................................................................................... 12
4. ĐỊNH VỊ TỰ ĐỘNG ................................................................................................................... 12
5. ĐIỀU PHỐI THÔNG MINH VÀ NHANH CHÓNG ................................................................................. 12
6. ĐIỀU HƯỚNG NHANH CHÓNG .................................................................................................... 12
7. TÍCH HỢP VỚI GPS ................................................................................................................. 13
8. TÍCH HỢP VỚI SMS ................................................................................................................. 13
9. TÍCH HỢP VỚI CCTV ............................................................................................................... 13
10. CÁC CHỨC NĂNG CẢNH BÁO TỰ ĐỘNG .................................................................................... 14
11. HIỂN THỊ TRỰC QUAN TRẠNG THÁI VÀ LỊCH SỬ CỦA VIỆC QUẢN LÍ SỰ CỐ QUA BẢN ĐỒ VÀ ĐỒ THỊ ..... 14
12. CÁC THỦ TỤC XỬ LÍ TÍNH HUỐNG KHẨN CẤP DỰA TRÊN QUY TRÌNH LUỒNG CÔNG VIỆC ................... 15
PHẦN VI. CHƯƠNG TRÌNH MINH HỌA ........................................................................................ 16
PHẦN VII. PHỤ LỤC MÃ NGUỒN CHƯƠNG TRÌNH: .................................................................... 33
1. CHỨC NĂNG GIẢI QUYẾT CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI VÀ K ĐIỂM GẦN NHẤT ...................................... 33
2. HIỂN THỊ CÁC ĐỐI TƯỢNG TRACKING ......................................................................................... 37
3. TƯƠNG TÁC TRÊN CÁC ĐỐI TƯỢNG TRACKING ............................................................................. 40
4. TÌM LỘ TRÌNH TỐI ƯU .............................................................................................................. 43
3
DANH SÁCH HÌNH ẢNH
HÌNH 1. KIẾN TRÚC VBD T4CH ...................................................................................................................................................... 5
HÌNH 2. THIẾT KẾ VIỆC BỐ TRÍ ......................................................................................................................................................... 7
HÌNH 3. MÀN HÌNH ĐĂNG NHẬP ....................................................................................................................................................... 8
HÌNH 4. MÀN HÌNH NHẬN VÀ XỬ LÝ SỰ CỐ ...................................................................................................................................... 9
HÌNH 5. MÀN HÌNH THEO DÕI, GIÁM SÁT ...................................................................................................................................... 10
HÌNH 6. MÀN HÌNH THỐNG KÊ....................................................................................................................................................... 11
HÌNH 7. MÀN HÌNH TÍCH HỢP VỚI CCTV ..................................................................................................................................... 14
HÌNH 9. MÀN HÌNH BẢN ĐỒ THEO CHỦ ĐỀ .................................................................................................................................... 15
HÌNH 10. THỦ TỤC XỬ LÍ TÌNH HUỐNG KHẨN CẤP ....................................................................................................................... 16
HÌNH 11. MÀN HÌNH ĐĂNG NHẬP CHƯƠNG TRÌNH ...................................................................................................................... 16
HÌNH 12. MÀN HÌNH KHỞI ĐỘNG CÔNG CỤ PHẢN ỨNG NHANH .................................................................................................. 17
HÌNH 13. CHỌN NGUỒN TIN........................................................................................................................................................... 17
HÌNH 14. MÀN HÌNH NHẬN XỬ LÍ SỰ CỐ ....................................................................................................................................... 18
HÌNH 15. MÀN HÌNH CHỌN LỰC LƯƠNG THAM GIA GIẢI QUYẾT SỰ CỐ ....................................................................................... 18
HÌNH 16. CẬP NHẬT THÔNG TIN HÌNH ẢNH/VIDEO VỀ HIỆN TRƯỜNG ...................................................................................... 19
HÌNH 17. CHỌN CÁC BỘ LỌC THEO LOẠI ĐỐI TƯỢNG ĐƯỢC ĐỊNH NGHĨA BẰNG HỆ QUẢN LÝ TÀI NGUYÊN .............................. 19
HÌNH 18. GEOCODING TỪ CHUỖI ĐỊA CHỈ TÌM KIẾM .................................................................................................................... 20
HÌNH 19. BẬT TẮT CÁC LỚP THÔNG TIN BẢN ĐỒ NỀN ................................................................................................................. 20
HÌNH 20. CÔNG CỤ TÌM K ĐỐI TƯỢNG GẦN NHẤT ....................................................................................................................... 21
HÌNH 21. XEM THÔNG TIN CHI TIẾT ĐỐI TƯỢNG TRÊN BẢN ĐỒ .................................................................................................. 21
HÌNH 22. TÌM ĐƯỜNG .................................................................................................................................................................... 22
HÌNH 23. TÌM ĐƯỜNG TRÁNH VÙNG CẤM ..................................................................................................................................... 22
HÌNH 24. KẾT QUẢ TÌM ĐƯỜNG TRÁNH VÙNG CẤM ..................................................................................................................... 23
HÌNH 25. MÀN HÌNH THEO DÕI CÁC TÀI NGUYÊN (ĐỐI TƯỢNG DI ĐỘNG) .................................................................................. 23
HÌNH 26. MÀN HÌNH TRUY VẤN CÁC ĐỐI TƯỢNG DI CHUYỂN THEO BÁN KÍNH .......................................................................... 24
HÌNH 27. MÀN HÌNH TRUY VẤN CÁC ĐỐI TƯỢNG DI CHUYỂN THEO VÙNG BẤT KỲ ..................................................................... 24
HÌNH 28. MÀN HÌNH ĐIỀU PHỐI CÁC PHƯƠNG TIỆN VẬN CHUYỂN THEO TUYẾN ....................................................................... 25
HÌNH 29. MÀN HÌNH QUẢN LÍ NGUỒN NHÂN LỰC KHI GIẢI QUYẾT SỰ CỐ ................................................................................... 25
HÌNH 30. MÀN HÌNH ĐỐI THOẠI KHI GIẢI QUYẾT SỰ VỤ .............................................................................................................. 26
HÌNH 31. BỘ BIỂU TƯỢNG SỬ DỤNG TRONG KHI GIẢI QUYẾT SỰ VỤ ........................................................................................... 26
HÌNH 32. MÀN HÌNH THEO CÁC CAMERA VÀ CHỨC NĂNG TỰ ĐỘNG NHẬN DIỆN CHÁY.............................................................. 27
HÌNH 33. MÀN HÌNH NHẬN DIỆN KHUÔN MẶT ............................................................................................................................. 27
HÌNH 34. MÀN HÌNH CHỌN KỊCH BẢN GIẢI QUYẾT SỰ VỤ ............................................................................................................ 28
HÌNH 35. MÀN HÌNH LUỒNG XỬ LÝ SỰ VỤ .................................................................................................................................... 28
HÌNH 36. MÀN HÌNH TÌM KIẾM DỰA VÀO KHUÔN MẶT TỪ FILE ẢNH .......................................................................................... 29
HÌNH 37. MÀN HÌNH THEO DÕI CẤU TRÚC TÒA NHÀ 3D ............................................................................................................. 29
HÌNH 38. MÀN HÌNH DANH MỤC CÁC TÍNH NĂNG TRONG ỨNG DỤNG TRÊN MOBILE ................................................................. 30
HÌNH 39. MÀN HÌNH CHÍNH TRONG ỨNG DỤNG TRÊN MOBILE ................................................................................................... 30
HÌNH 40. BIỂU MẪU NHẬP MỘT SỰ VỤ MỚI TRÊN ỨNG DỤNG MOBILE ....................................................................................... 31
HÌNH 41. MÀN HÌNH DANH SÁCH CÁC SỰ VỤ ĐÃ NHẬP ............................................................................................................... 31
HÌNH 42. MÀN HÌNH THIẾT LẬP CÁC LỚP DỮ LIỆU ...................................................................................................................... 32
HÌNH 43. MÀN HÌNH CHỌN LỚP DỮ LIỆU ĐỂ LÀM VIỆC ............................................................................................................... 32
VBD T4CH TRANG 4
PHẦN I. GIỚI THIỆU
Các HỆ THỐNG TRUNG TÂM THÔNG TIN CHỈ HUY - VBD T4CH hiện đại
nhắm đến việc nâng cao khả năng của chính phủ trong việc bảo vệ mạng sống
và tài sản của công dân; an ninh quốc gia và bình ổn xã hội cũng như thúc đẩy
phát triển kinh tế và xã hội toàn diện, có tổ chức và bền vững.
VBD T4CH là sự tích hợp của các công nghệ hiện đại như hệ thống định
vị toàn cầu (GPS), hệ thống Camera giám sát (CCTV), hội thảo trực tuyến, hệ
thống quản lý tài nguyên (DMS) và hệ thống thông Tin địa lý (GIS), v.v. VBD
T4CH cung cấp một giải pháp tổng thể cho tất cả tình huống khấn cấp công
cộng của các cơ quan chính phủ. Các sản phẩm về VBD T4CH nâng cao khả
năng chỉ huy tập trung của chính phủ, ứng phó kịp thời, và phối hợp giữa các
cơ quan ban ngành. Điều này sẽ cải thiện tính hiệu quả trong việc tiếp nhận,
xử lý tình huống khẩn cấp, giám sát và bảo đảm tuyệt mật, lưu giữ các hồ sơ
an toàn của tất cả hoạt động.
PHẦN II. KIẾN TRÚC HỆ THỐNG
Kiến trúc VBD T4CH bao gồm 5 lớp, bắt đầu từ dưới lên: Lớp Cơ Sở Hạ
Tầng, Lớp Dữ Liệu, Lớp Các Ứng Dụng, Lớp Liên Lạc và Lớp Người Dùng (xem
hình 1). Mô tả ngắn ngọn như sau:
VBD T4CH TRANG 5
Hình 1. Kiến trúc VBD T4CH
1. Lớp Cơ Sở Hạ Tầng
Bao gồm các thiết bị phần cứng máy tính (Máy chủ, máy tính để bàn,
thiết bị ngoại vi, UPS,..); cơ sở vật chất chuyên biệt cho VBD T4CH (các phòng
đặt máy chủ, trung tâm điều khiển,…) và hệ thống mạng (thiết kế đường dẫn
cáp theo cấu trúc, bộ chuyển mạch - switch, bộ định tuyến - rounter, các ống
dẫn cáp quang,… )
VBD T4CH TRANG 6
2. Lớp Dữ Liệu
Được thiết kế bởi cơ sở dữ liệu (CSDL) theo yêu cầu giống như CSDL
GIS ( gồm bản đồ tham chiếu, bản đồ đường xá, ảnh độ phân giải cao); CSDL
phải lưu trữ được nhật kí và hồ sơ của những tình huống khẩn cấp đã và đang
xảy ra; Các CSDL liên quan khác và CSDL hệ thống để quản lý cấu hình của
VBD T4CH.
3. Lớp Ứng Dụng
Là 1 trong những nến tảng phát triển tích hợp tất cả các môđun chức
năng của VBD T4CH và các giao diện tích hợp đến hệ thống bên ngoài hiện
hữu (ví dụ như gói GSM/GPRS, hệ thống CCTV, GPS,… ).
4. Lớp Liên Lạc
Được định nghĩa bởi các giao thức liên lạc sẵn có. Bao gồm dịch vụ công
cộng và mạng lưới điện thoại (điện thoại di động, điện thoại cố định, Hệ thống
VoIP) và mạng lưới gói/điện thoại/radio được tích hợp trong lớp này.
5. Lớp người dùng
Tất cả người dùng khi truy cập đến hệ thống sẽ được liệt kê trong lớp
này. Được phân loại thành 5 nhóm với các quyền sau: Quyền Công Khai (gọi
báo cần giúp đỡ và sự cố), Quyền Điều Hành (tiếp nhận các cuộc gọi đến và
xử lí cuộc gọi đó), Quyền Giám Sát (điều khiển hệ thống VBD T4CH và can
thiệp để điều chỉnh các sai lệch nếu cần ), Quyền Điều Phối (phân công cho
bộ phận ứng phó xử lí tình huống và kiểm soát quá trình), và bộ phận Ứng
Phó (nhóm này phải đối phó với tình trạng khẩn cấp và cung cấp thông tin
VBD T4CH TRANG 7
phản hồi).
PHẦN III. BỐ TRÍ VÀ THIẾT KẾ MẠNG LƯỚI
Biểu đồ dưới đây thể hiện dạng bố trí điển hình của VBD T4CH. Nó sử
dụng chỉ một Trung Tâm Tiếp Nhận Cuộc Gọi duy nhất và một Trung Tâm
Giám Sát nhưng lại nhiều Trung Tâm Điều Phối. Nếu cần thiết, VBD T4CH có
thể mở rộng nhiều Trung Tâm Tiếp Nhận Cuộc Gọi đa cấp, Trung Tâm Giám
Sát và Trung Tâm Điều Phối với điều chỉnh tối thiểu.
Hình 2. Thiết kế việc bố trí
VBD T4CH TRANG 8
PHẦN IV. CẤU TRÚC CHỨC NĂNG VBD T4CH
Hệ thống VBD T4CH là dạng cấu trúc bao gồm 7 môđun chức năng:
Nhận tình huống khẩn cấp
Giám sát tình huống khẩn cấp
Điều phối tình huống khẩn cấp
Phản hổi tình huống khẩn cấp
Thống kê tình huống khẩn cấp
Môđun quản trị hệ thống
Tất cả các môđun chức năng chạy trên các máy chủ trung tâm. Những
người dùng có thể đăng nhập và sử dụng hệ thống bằng phần mềm kết nối
mạng thông qua giao thức IP bảo mật. Để truy cập vào các chức năng của VBD
T4CH còn phụ thuộc vào quyền hạn của người dùng. Nhà quản trị của hệ
thống được phép chỉ định hoặc điều chỉnh nhóm quyền bất kể lúc nào. Tuy
nhiên, tất cả người dùng chia sẻ cùng mẫu các giao diện sử dụng (cụ thể họ
chỉ sử dụng được các chức năng trong quyền hạn của mình) do đó giảm thiểu
được công sức huấn luyện và chi phí bảo trì.
Hình 3. Màn hình đăng nhập
Phương pháp thông thường để báo cáo một tình huống khẩn cấp đang
xảy ra là gọi về trung tâm tiếp nhận khẩn cấp thông qua một số điện thoại
VBD T4CH TRANG 9
khẩn cấp (thường ngắn và dễ nhớ ví dụ như 113, 114, ...) Cũng có thể gửi tin
nhắn (SMS) đến các số điện thoại khẩn cấp đó, hữu dụng trong một số tình
huống nhất định. Nhóm điều hành của hệ thống VBD T4CH sẽ dùng mô đun
Nhận Tình Huống Khẩn Cấp để xử lí sự cố gọi đến từ bất kì nguồn thông tin
nào.
Hình 4. Màn hình nhận và xử lý sự cố
Nhóm Giám Sát có thể xem lại các tình huống đang diễn ra và điều
chỉnh những việc sai lệch không mong muốn bằng sử dụng các chức năng có
trong môđun chức năng giám sát và thống kê. Nhóm Điều Phối dùng mô đun
Điều Phối Tình Huống Khẩn Cấp để hướng dẫn bộ phận ứng phó khẩn cấp và
nhận phản hồi từ bộ phận này. Sau khi sự cố kết thúc phiên làm việc, thì các
chức năng của mô đun Phản Hồi Tình Huống Khẩn Cấp phải lưu giữ hồ sơ và
xuất báo cáo. Hồ sơ bao gồm những phản hồi từ nhóm ứng phó. Nhóm Giám
sát và nhóm điều phối có thể có chức năng của mô đun Thống Kê để tạo hoặc
xem qua báo cáo, đồ thị, và các bảng về các sự cố đã và đang xảy ra. Môđun
VBD T4CH TRANG 10
Quản Trị của hệ thống VBD T4CH cho phép các quản trị viên cấu hình toàn
bộ hệ thống, xác định phiên làm việc của các lệnh xử lí tình huống khẩn cấp
và thực thi các lệnh bảo trì.
Hình 5. Màn hình theo dõi, giám sát
Các môđun chức năng của hệ thống VBD T4CH có tích hợp liền mạch
với GIS. Việc định vị cơ bản và xem bản đồ, các chức năng truy vấn được cung
cấp từ GIS nhằm giúp các cơ quan điều hành định vị những sự cố, và giúp
những cơ quan điều phối xác định vị trí các tài nguyên ứng phó khẩn cấp.
Nhờ vào chức năng GIS về việc lên phương án và điều phối của hệ thống VBD
T4CH sẽ giúp các cơ quan điều phối nhanh chóng xác định đúng nhóm ứng
phó và gửi nhóm này đến nơi xảy ra tình trạng khẩn cấp. Môđun thống kê còn
tích hợp các hàm dịch vụ GIS nhằm hiển thị bản đồ theo chủ đề thể hiện mức
độ hiệu quả, cho phép đánh giá ngay hiệu năng cũng như cải thiện quá trình
ứng phó khẩn cấp.
VBD T4CH TRANG 11
Hình 6. Màn hình thống kê
PHẦN V. CÁC CHỨC NĂNG CHÍNH
1. Dễ dàng triển khai và bảo trì
Kiến trúc dịch vụ là một trong những tiêu chuẩn công nghê dễ dàng
triển khai và duy trì. VBD T4CH sử dụng các công nghệ mạng chuẩn để truy
cập vào dữ liệu tập trung và các dịch vụ.
2. Tích hợp với Trung Tâm Tiếp Nhận Sự Cố
Qua Điện Thoại
VBD T4CH sẽ tích hợp rất tốt với các hệ thống trung tâm cuộc gọi. Bất
cứ khi nào có một cuộc gọi, số của người gọi, tên, địa chỉ, và tọa độ (phụ thuộc
VBD T4CH TRANG 12
vào tính sẵn có) xuất hiện trong hồ sơ khẩn cấp và một bảng lịch sử của các
cuộc gọi liên quan đã sẵn sàng để tham khảo dễ dàng
3. Chia sẻ thông tin hiệu quả
VBD T4CH sử dụng một chiến lược chia sẻ thông tin có hệ thống, cả
trong thu thập , xử lý, giao tiếp, lưu trữ, hiển thị, và phân tích. Điều này có thể
làm tăng hiệu quả công việc của các phòng ban có liên quan và cải thiện việc
ra quyết định cho người giám sát, điều phối viên và các đơn vị phản ứng.
4. Định vị tự động
Mô-đun định vị thông minh của hệ thống VBD T4CH có thể nhanh
chóng chuyển đổi địa chỉ văn bản, số điện thoại, cột mốc đường, giao lộ sang
tọa độ địa lý và hiển thị vị trí trên bản đồ tham chiếu trong thời gian thực.
5. Điều phối thông minh và nhanh chóng
Hệ thống VBD T4CH hỗ trợ đầy đủ các chức năng lên phuơng án cho
các tình huống khẩn cấp. Những người dùng có thẩm quyền sẽ lên phương
án cho các tình huống khẩn cấp khác nhau và sau đó, hệ thống này tự động
phối hợp các tình huống khẩn cấp với 1 sơ đồ dự đoán tình huống thông qua
vị trí, kiểu loại, cấp độ và sẽ đề nghị các đơn vị ứng phó và hành động. Với
cách này thì tiết kiệm thời gian cho các nhóm giám sát và điều phối, khiến họ
chú ý nhiều hơn đối với các tình huống khẩn cấp phức tạp và bất ngờ.
6. Điều hướng nhanh chóng
Hệ thống VBD T4CH đặc cách hỗ trợ trong việc tìm kiếm tuyến ngắn
VBD T4CH TRANG 13
nhất/nhanh nhất trên các mạng lưới đường bộ chi tiết để giảm thiểu sự chậm
trễ của các đơn vị ứng phó đến nơi xảy ra sự cố. Việc định tuyến và danh sách
chặng đường luôn có sẵn cho các thiết bị điều hướng phương tiện hoặc cho
gửi tin nhắn đến thiết bị có khả năng nhận hướng dẫn văn bản.
7. Tích hợp với GPS
Với việc tích hợp công nghệ GPS trong hệ thống VBD T4CH, các giám
sát và điều phối có thể nhìn thấy các vị trí thực của các xe cảnh sát hoặc cơ
quan chính phủ, xe cứu thương và xe chữa cháy đang xử lí dữ liệu từ các tín
hiệu GPS gửi tới. Các nhóm giám sát , điều phối và thành viên VIP có thể quan
sát việc ứng phó khẩn cấp từ hệ thống VBD T4CH để chắc rằng mọi thứ điều
thực hiện đúng kịch bản.
8. Tích hợp với SMS
Hệ thống VBD T4CH hỗ trợ cổng SMS để bất kì thông tin điều phối sẵn
sàng gửi đến các đơn vị ứng phó qua dịch vụ tích hợp SMS.
9. Tích hợp với CCTV
Hệ thống VBD T4CH cũng tích hợp với hệ thống CCTV. Các giám sát
viên và điều phối viên có thể tìm thấy các thiết bị máy quay CCTV gần nhất
tại nơi xảy ra sự cố bằng cách thực hiện truy vấn địa lý trực tiếp trên bản đồ
và có thể chuyển đổi qua lại các thiết bị quay để truy xuất những hình ảnh
thực. Điều này giúp các giám sát và điều phối có được thông tin trực quan về
toàn cảnh sự cố và môi trường xung quanh. Từ đó thiết lập nhữg quyết định
đúng đắn với phản hồi thực tế.
VBD T4CH TRANG 14
Hình 7. Màn hình tích hợp với CCTV
10. Các chức năng cảnh báo tự động
Khi một sự cố xảy ra, hệ thống VBD T4CH cảnh báo các điều phối viên
tương ứng bằng việc sử dụng giao diện phần mềm riêng biệt và các tín hiệu
khác (như còi báo động, đèn) theo các cấp độ khẩn cấp định nghĩa trước đó.
Hệ thống VBD T4CH sẽ liên tục gửi tín hiệu khẩn cấp đều đặn đến khi các điều
phối viên phản hồi hợp lí với sự cố.
11. Hiển thị trực quan trạng thái và lịch sử của
việc quản lí sự cố qua bản đồ và đồ thị
Hệ thống VBD T4CH có hỗ trợ riêng trong việc hiển thị trực quan các
thông tin báo cáo và thống kê bằng bản đồ và đồ thị theo chủ đề tùy chọn.
Việc đánh giá về tình hình tổng thể và hiệu suất phản ứng của đơn vị là trực
quan, với nỗ lực tối thiểu.
VBD T4CH TRANG 15
Hình 8. Màn hình bản đồ theo chủ đề
12. Các thủ tục xử lí tính huống khẩn cấp dựa
trên quy trình luồng công việc
Bên trong VBD T4CH, các thủ tục xử lí tình huống khẩn cấp được định
nghĩa và quản lí bằng cách sử dụng công nghệ quy trình luồng công việc, giúp
người dùng có thể linh hoạt hơn để thích nghi hệ thống làm việc theo cơ cầu
tổ chức và quản lý sự cố trên khuôn khổ văn hóa và pháp lí.
VBD T4CH TRANG 16
Hình 9. Thủ tục xử lí tình huống khẩn cấp
PHẦN VI. CHƯƠNG TRÌNH MINH HỌA
Đăng nhập hệ thống
Hình 10. Màn hình đăng nhập chương trình
VBD T4CH TRANG 17
Vào phiên làm việc
Hình 11. Màn hình khởi động Công cụ phản ứng nhanh
Chọn nguồn tin để xem
Hình 12. Chọn nguồn tin
VBD T4CH TRANG 18
Màn hình nhận xử lý sự cố
Hình 13. Màn hình nhận xử lí sự cố
Màn hình chọn lực lượng tham gia giải quyết sự cố
Hình 14. Màn hình chọn lực lương tham gia giải quyết sự cố
VBD T4CH TRANG 19
Cập nhật thông tin hình ảnh/video về hiện trường
Hình 15. Cập nhật thông tin hình ảnh/video về hiện trường
Chọn các bộ lọc theo loại đối tượng được định nghĩa bằng hệ quản
lý tài nguyên
Hình 16. Chọn các bộ lọc theo loại đối tượng được định nghĩa bằng hệ quản lý tài nguyên
VBD T4CH TRANG 20
Geocoding từ chuỗi địa chỉ tìm kiếm
Hình 17. Geocoding từ chuỗi địa chỉ tìm kiếm
Bật tắt các lớp thông tin bản đồ nền
Hình 18. Bật tắt các lớp thông tin bản đồ nền
VBD T4CH TRANG 21
Công cụ tìm K đối tượng gần nhất
Hình 19. Công cụ tìm K đối tượng gần nhất
Xem thông tin chi tiết đối tượng trên bản đồ
Hình 20. Xem thông tin chi tiết đối tượng trên bản đồ
VBD T4CH TRANG 22
Tìm đường
Hình 21. Tìm đường
Tìm đường tránh vùng cấm
Hình 22. Tìm đường tránh vùng cấm
VBD T4CH TRANG 23
Kết quả tìm đường tránh vùng cấm
Hình 23. Kết quả tìm đường tránh vùng cấm
Màn hình theo dõi các tài nguyên (đối tượng di động)
Hình 24. Màn hình theo dõi các tài nguyên (đối tượng di động)
VBD T4CH TRANG 24
Màn hình truy vấn các đối tượng di chuyển theo bán kính (dọc
theo tuyến)
Hình 25. Màn hình truy vấn các đối tượng di chuyển theo bán kính
Màn hình truy vấn các đối tượng di chuyển theo vùng bất kỳ
Hình 26. Màn hình truy vấn các đối tượng di chuyển theo vùng bất kỳ
VBD T4CH TRANG 25
Màn hình điều phối các phương tiện vận chuyển theo tuyến
Hình 27. Màn hình điều phối các phương tiện vận chuyển theo tuyến
Màn hình quản lí nguồn nhân lực khi giải quyết sự cố
Hình 28. Màn hình quản lí nguồn nhân lực khi giải quyết sự cố
VBD T4CH TRANG 26
Màn hình đối thoại khi giải quyết sự vụ
Hình 29. Màn hình đối thoại khi giải quyết sự vụ
Bộ biểu tượng sử dụng trong khi giải quyết sự vụ
Hình 30. Bộ biểu tượng sử dụng trong khi giải quyết sự vụ
VBD T4CH TRANG 27
Màn hình theo các camera và chức năng tự động nhận diện cháy
Hình 31. Màn hình theo các camera và chức năng tự động nhận diện cháy
Màn hình nhận diện khuôn mặt
Hình 32. Màn hình nhận diện khuôn mặt
VBD T4CH TRANG 28
Màn hình chọn kịch bản giải quyết sự vụ
Hình 33. Màn hình chọn kịch bản giải quyết sự vụ
Màn hình luồng xử lý sự vụ (workflow)
Hình 34. Màn hình luồng xử lý sự vụ
VBD T4CH TRANG 29
Màn hình tìm kiếm dựa vào khuôn mặt từ file ảnh
Hình 35. Màn hình tìm kiếm dựa vào khuôn mặt từ file ảnh
Màn hình theo dõi cấu trúc tòa nhà 3D
Hình 36. Màn hình theo dõi cấu trúc tòa nhà 3D
VBD T4CH TRANG 30
Màn hình danh mục các tính năng trong ứng dụng trên mobile
Hình 37. Màn hình danh mục các tính năng trong ứng dụng trên mobile
Màn hình chính trong ứng dụng trên mobile
Hình 38. Màn hình chính trong ứng dụng trên mobile
VBD T4CH TRANG 31
Biểu mẫu nhập một sự vụ mới trên ứng dụng mobile
Hình 39. Biểu mẫu nhập một sự vụ mới trên ứng dụng mobile
Màn hình danh sách các sự vụ đã nhập
Hình 40. Màn hình danh sách các sự vụ đã nhập
VBD T4CH TRANG 32
Màn hình thiết lập các lớp dữ liệu
Hình 41. Màn hình thiết lập các lớp dữ liệu
Màn hình chọn lớp dữ liệu để làm việc
Hình 42. Màn hình chọn lớp dữ liệu để làm việc
VBD T4CH TRANG 33
PHẦN VII. PHỤ LỤC MÃ NGUỒN CHƯƠNG
TRÌNH:
1. Chức năng giải quyết các bài toán về
đường đi và K điểm gần nhất
int Solve()
{
const int num_coordinates =
_waypoint_cmd.coordinates.GetSize();
ASSERT(num_coordinates ==
_waypoint_cmd.is_source.GetSize());
ASSERT(num_coordinates ==
_waypoint_cmd.is_target.GetSize());
ASSERT(num_coordinates ==
_waypoint_cmd.uturns.GetSize());
StatusCode status = StatusCode::Error;
if (_neighbor_gif_timer)
{
_neighbor_gif_timer->stop();
delete _neighbor_gif_timer;
_neighbor_gif_timer = NULL;
}
if (_route_response)
{
delete _route_response;
_route_response = NULL;
}
switch (_routing_type)
{
case RoutingType::SHORTEST_PATH:
{
_viaroute_request.Clear();
_viaroute_request.geometries = true;
_viaroute_request.steps = true;
VBD T4CH TRANG 34
_viaroute_request.distances = true;
_viaroute_request.durations = true;
_viaroute_request.alternatives = 2;
for (int i = 0; i < num_coordinates; ++i)
{
const Point2D &pt =
_waypoint_cmd.coordinates[i];
_viaroute_request.AddCoordinate(pt.y,
pt.x);
}
const int num_uturns =
_waypoint_cmd.uturns.GetSize();
for (int u = 0; u < num_uturns; ++u)
{
_waypoint_cmd.uturns[u]
? _viaroute_request.AddUTurn()
: _viaroute_request.AddStraight();
}
_viaroute_request.barriers =
!_barrier_shapes.empty();
_route_request = &_viaroute_request;
status = Request(_route_request,
_route_response);
break;
}
case RoutingType::ROUND_TRIP:
{
_trip_request.Clear();
_trip_request.geometries = true;
_trip_request.steps = true;
_trip_request.distances = true;
_trip_request.durations = true;
for (int i = 0; i < num_coordinates; ++i)
{
const Point2D &pt =
_waypoint_cmd.coordinates[i];
_trip_request.AddCoordinate(pt.y, pt.x);
}
const int num_uturns =
VBD T4CH TRANG 35
_waypoint_cmd.uturns.GetSize();
for (int u = 0; u < num_uturns; ++u)
{
_waypoint_cmd.uturns[u]
? _trip_request.AddUTurn()
: _trip_request.AddStraight();
}
_route_request = &_trip_request;
status = Request(_route_request,
_route_response);
break;
}
case RoutingType::K_NEAREST_NEIGHBORS:
{
if (VDMS_GetVisibleLayers(_vdms_layer_names))
{
std::vector<std::string> guids;
std::vector<unsigned> layer_indices;
std::vector<FloatPointCoordinate>
coordinates;
const Point2D &pt =
_waypoint_cmd.coordinates[0];
const bool reverse =
_waypoint_cmd.is_target[0];
double degree_radius = (50. *
_num_k_nearest) / DEGREE_APPROXIMATION;
unsigned trials = 0;
GERect2D rect;
do {
rect.left = pt.x - degree_radius;
rect.top = pt.y - degree_radius;
rect.right = pt.x + degree_radius;
rect.bottom = pt.y + degree_radius;
VDMS_RangeQuery(_vdms_layer_names,
rect, guids, layer_indices, coordinates);
degree_radius *= 1.5;
++trials;
} while ((guids.size() < _num_k_nearest) &&
(trials < _num_k_nearest));
VBD T4CH TRANG 36
const unsigned num_targets = guids.size();
ASSERT(num_targets == coordinates.size());
ASSERT(num_targets ==
layer_indices.size());
if (0 < num_targets)
{
RoutingModel::Response::BaseResponse*
route_res = NULL;
_location_request.Clear();
_location_request.clear_all = true;
for (size_t t = 0; t < num_targets;
++t)
{
_location_request.AddCoordinate(coordinates[t]);
_location_request.AddIdentifier(guids[t]);
}
if (StatusCode::Ok ==
Request(&_location_request, route_res))
{
_neighbor_request.Clear();
_neighbor_request.neighbor_criteria =
NeighborCriteria::ITEMS;
_neighbor_request.items_per_page
= _num_k_nearest;
_neighbor_request.page_index = 0;
_neighbor_request.geometries =
true;
_neighbor_request.steps = true;
_neighbor_request.distances =
true;
_neighbor_request.durations =
true;
_neighbor_request.barriers =
!_barrier_shapes.empty();
_neighbor_request.reverse_direction = reverse;
_neighbor_request.AddCoordinate(pt.y, pt.x);
VBD T4CH TRANG 37
_route_request =
&_neighbor_request;
status = Request(_route_request,
_route_response);
if (StatusCode::Ok == status)
{
std::chrono::milliseconds
time_between_frames(_round(1000. / _neighbor_gif_fps));
_neighbor_gif_timer = new
Timer([]() {
_doc->Redraw(false,
true);
_app->GetViewPort()-
>GetWindow()->Invalidate(FALSE);
}, time_between_frames,
false);
_neighbor_gif_timer-
>start(true);
}
}
if (route_res)
{
delete route_res;
route_res = NULL;
}
}
}
break;
}
}
_route_result_wnd.FillResult(_route_request,
_route_response);
return status;
}
2. Hiển thị các đối tượng Tracking
void CTrackerVehicleLayer::Draw(CTileZoomManager
*tile_manager, CDC *pDC)
VBD T4CH TRANG 38
{
GERect2D real_rect;
tile_manager->TileSystem.PixelXYToLatLong(
tile_manager->WindowMinX, tile_manager-
>WindowMinY,
tile_manager->View.LevelOfDetail,
real_rect.top, real_rect.left);
tile_manager->TileSystem.PixelXYToLatLong(
tile_manager->WindowMaxX, tile_manager-
>WindowMaxY,
tile_manager->View.LevelOfDetail,
real_rect.bottom, real_rect.right);
if (real_rect.right < real_rect.left)
{
const auto tmp = real_rect.right;
real_rect.right = real_rect.left;
real_rect.left = tmp;
}
if (real_rect.bottom < real_rect.top)
{
const auto tmp = real_rect.bottom;
real_rect.bottom = real_rect.top;
real_rect.top = tmp;
}
TrackingModel::Response::BaseResponse *response =
NULL;
TrackingModel::Request::BlobRequest blob_req;
CMessage msg;
uint8_t *buffer;
size_t length;
blob_req.min_lat = real_rect.top *
COORDINATE_PRECISION;
blob_req.min_lng = real_rect.left *
COORDINATE_PRECISION;
blob_req.max_lat = std::ceil(real_rect.bottom *
COORDINATE_PRECISION);
blob_req.max_lng = std::ceil(real_rect.right *
COORDINATE_PRECISION);
blob_req.zoom_level = tile_manager-
VBD T4CH TRANG 39
>View.LevelOfDetail;
blob_req.vehicle_layer = true;
blob_req.vehicle_coords = true;
blob_req.vehicle_statuses = true;
blob_req.vehicle_types = true;
blob_req.vehicle_type_filter = m_tracker_grid_ctrl-
>GetVehTypeFilter();
blob_req.vehicle_status_filter =
m_tracker_grid_ctrl->GetStatusFilter();
blob_req.Serialize(buffer, length);
const auto req_key = m_request.NextRequestKey();
msg.SetCommand(MC_BLOB_QUERY);
msg.SetData(buffer, length);
msg.SetLPARAM(req_key);
m_request.Push(&msg);
delete[]buffer;
if (m_request.WaitForResponse(req_key, m_timeout,
response))
{
assert(TrackingModel::Response::Type::Blob ==
response->GetResponseType());
auto blob_res = static_cast<const
TrackingModel::Response::BlobResponse*>(response);
if (StatusCode::Ok == blob_res->status)
{
HDC hDC = pDC->GetSafeHdc();
Gdiplus::Graphics g(hDC);
double vx, vy;
const size_t num_blobs = blob_res-
>vehicle_ids.size();
assert(num_blobs == blob_res-
>vehicle_coords.size());
for (size_t b = 0; b < num_blobs; ++b)
{
const FixedPointCoordinate &coord =
blob_res->vehicle_coords[b];
tile_manager-
>TileSystem.LatLongToPixelXYDouble(
coord.lat / GEOHASH_PRECISION,
coord.lon / GEOHASH_PRECISION,
VBD T4CH TRANG 40
tile_manager->View.LevelOfDetail,
vx, vy);
vx -= tile_manager->WindowMinX;
vy -= tile_manager->WindowMinY;
if (VehicleStatus::Disconnected &
blob_res->vehicle_statuses[b])
{
g.DrawImage(m_veh_stat_imgs[0],
(int)vx -
m_veh_stat_img_width, (int)vy - m_veh_stat_img_height);
}
else
{
g.DrawImage(m_veh_type_imgs[_VehicleType2Index(blob
_res->vehicle_types[b])],
(int)vx -
m_veh_type_img_width, (int)vy - m_veh_type_img_height);
}
}
}
delete blob_res;
}
}
3. Tương tác trên các đối tượng Tracking
int CTrackerVehicleLayer::Selection(const GERect2D &rR,
const UINT &nMode, void**& pReParam)
{
int nSize = 0;
if (!Visible())
return nSize;
TrackingModel::Response::BaseResponse *response =
NULL;
TrackingModel::Request::RangeRequest range_req;
CMessage msg;
uint8_t *buffer;
size_t length;
VBD T4CH TRANG 41
range_req.min_lat = rR.top * COORDINATE_PRECISION;
range_req.min_lng = rR.left * COORDINATE_PRECISION;
range_req.max_lat = std::ceil(rR.bottom *
COORDINATE_PRECISION);
range_req.max_lng = std::ceil(rR.right *
COORDINATE_PRECISION);
range_req.vehicle_type_filter = m_tracker_grid_ctrl-
>GetVehTypeFilter();
range_req.vehicle_status_filter =
m_tracker_grid_ctrl->GetStatusFilter();
range_req.vehicle_layer = true;
range_req.vehicle_plates = true;
range_req.vehicle_company_ids = true;
range_req.vehicle_dept_ids = true;
range_req.vehicle_types = true;
range_req.vehicle_coords = true;
range_req.vehicle_times = true;
range_req.vehicle_speeds = true;
range_req.vehicle_statuses = true;
range_req.vehicle_headings = true;
range_req.Serialize(buffer, length);
const auto req_key = m_request.NextRequestKey();
msg.SetCommand(MC_RANGE_QUERY);
msg.SetData(buffer, length);
msg.SetLPARAM(req_key);
m_request.Push(&msg);
delete[]buffer;
std::vector<int> vtObjSel;
if (m_request.WaitForResponse(req_key, m_timeout,
response))
{
assert(TrackingModel::Response::Type::Range ==
response->GetResponseType());
auto range_res =
static_cast<TrackingModel::Response::RangeResponse*>(res
ponse);
bool up_to_date = true;
if ((m_departments.Version() < range_res-
>dept_version) ||
(m_companies.Version() < range_res-
>company_version))
{
VBD T4CH TRANG 42
up_to_date = PullRequest();
}
if (up_to_date)
{
if (StatusCode::Ok == range_res->status)
{
m_vehicles.Swap(*range_res);
uint32_t closest_index = 0;
const size_t num_trackers =
m_vehicles.Size();
if (num_trackers > 1)
{
const FloatPointCoordinate
center(rR.CenterY(), rR.CenterX());
double closest_dist =
(std::numeric_limits<double>::max)();
for (size_t v = 0; v <
num_trackers; ++v)
{
const FloatPointCoordinate
coord(
m_vehicles.GetCoordinate(v).lat / GEOHASH_PRECISION,
m_vehicles.GetCoordinate(v).lon /
GEOHASH_PRECISION);
const double dist =
Coordinate::haversine_distance(center, coord);
if (closest_dist > dist)
{
closest_dist = dist;
closest_index = v;
}
}
}
vtObjSel.push_back(m_vehicles.At(closest_index));
}
}
VBD T4CH TRANG 43
else
{
//AfxMessageBox(_T("Data is out-of-date"));
}
delete range_res;
nSize = vtObjSel.size();
if (nSize > 0)
{
pReParam = new void*[3];
int nVal = param_INT;
int i = 0;
pReParam[i] = malloc(sizeof(int));
memcpy(pReParam[i], &nVal, sizeof(int));
i++;
pReParam[i] = malloc(sizeof(int));
memcpy(pReParam[i], &nSize, sizeof(int));
i++;
for (int nIdx : vtObjSel)
{
pReParam[i] = malloc(sizeof(int));
memcpy(pReParam[i], &nIdx,
sizeof(int));
i++;
}
}
}
return nSize;
}
4. Tìm lộ trình tối ưu
bool Dispatch(FD_PROFILE &profile)
{
profile.solution.Clear();
profile.solved = false;
VBD T4CH TRANG 44
rapidjson::Document json_doc;
rapidjson::Document::AllocatorType& allocator =
json_doc.GetAllocator();
rapidjson::Value
json_body_obj(rapidjson::Type::kObjectType);
rapidjson::Value
json_veh_types(rapidjson::Type::kArrayType);
for (auto it = _veh_types.cbegin(), end =
_veh_types.cend(); it != end; ++it)
{
const auto &type_id = it->first;
const auto &veh_type = it->second;
rapidjson::Value
json_veh_type(rapidjson::Type::kObjectType);
json_veh_type.AddMember("type_id", type_id,
allocator);
json_veh_type.AddMember("capacity",
veh_type.capacity, allocator);
json_veh_types.PushBack(json_veh_type,
allocator);
}
json_body_obj.AddMember("vehicle_types",
json_veh_types, allocator);
rapidjson::Value
json_vehicles(rapidjson::Type::kArrayType);
for (auto it = profile.drivers.cbegin(), end =
profile.drivers.cend(); it != end; ++it)
{
const auto &driver_id = *it;
const auto &driver = _drivers.at(driver_id);
const std::string driver_name =
CW2A(driver.name.c_str(), CP_UTF8);
const std::string driver_address_name =
CW2A(driver.address.name.c_str(), CP_UTF8);
rapidjson::Value
json_vehicle(rapidjson::Type::kObjectType);
json_vehicle.AddMember("vehicle_id", driver_id,
allocator);
json_vehicle.AddMember("name", driver_name,
allocator);
json_vehicle.AddMember("type_id",
driver.vehicle, allocator);
VBD T4CH TRANG 45
rapidjson::Value
json_address(rapidjson::Type::kObjectType);
json_address.AddMember("location_id",
driver_address_name, allocator);
json_address.AddMember("lon",
driver.address.lon, allocator);
json_address.AddMember("lat",
driver.address.lat, allocator);
json_vehicle.AddMember("start_address",
json_address, allocator);
json_vehicles.PushBack(json_vehicle,
allocator);
}
json_body_obj.AddMember("vehicles", json_vehicles,
allocator);
rapidjson::Value
json_services(rapidjson::Type::kArrayType);
for (auto it = profile.stops.cbegin(), end =
profile.stops.cend(); it != end; ++it)
{
const auto &stop_id = *it;
const auto &stop = _stops.at(stop_id);
const std::string stop_name =
CW2A(stop.name.c_str(), CP_UTF8);
const std::string stop_address_name =
CW2A(stop.address.name.c_str(), CP_UTF8);
rapidjson::Value
json_service(rapidjson::Type::kObjectType);
json_service.AddMember("id", stop_id,
allocator);
json_service.AddMember("name", stop_name,
allocator);
json_service.AddMember("size", stop.load,
allocator);
rapidjson::Value
json_address(rapidjson::Type::kObjectType);
json_address.AddMember("location_id",
stop_address_name, allocator);
json_address.AddMember("lon", stop.address.lon,
allocator);
json_address.AddMember("lat", stop.address.lat,
allocator);
json_service.AddMember("address", json_address,
VBD T4CH TRANG 46
allocator);
json_services.PushBack(json_service,
allocator);
}
json_body_obj.AddMember("services", json_services,
allocator);
rapidjson::StringBuffer json_ss;
rapidjson::Writer<rapidjson::StringBuffer>
json_writer(json_ss);
json_body_obj.Accept(json_writer);
wchar_t szSize[50] = L"";
swprintf_s(szSize, L"%d", json_ss.GetSize());
wstring headers = L"Content-Length: ";
headers += szSize;
headers += L"\r\nContent-Type:
application/json\r\n";
_vrp_http_client-
>SetAdditionalDataToSend((BYTE*)json_ss.GetString(),
json_ss.GetSize());
_vrp_http_client-
>SetAdditionalRequestHeaders(headers);
if (!_vrp_http_client->SendHttpRequest(_T("POST"),
false))
{
return false;
}
const BYTE *buffer = _vrp_http_client-
>GetRawResponseContent();
if (!buffer)
{
return false;
}
if (json_doc.Parse((const
char*)buffer).HasParseError())
{
return false;
}
RoutingModel::Request::ViaRouteRequest
VBD T4CH TRANG 47
viaroute_request;
auto viaroute_status = StatusCode::Ok;
viaroute_request.vehicle = VehicleType::motorcar;
viaroute_request.geometries = true;
viaroute_request.steps = false;
viaroute_request.distances = false;
viaroute_request.durations = false;
const std::string url = _routing_http_url +
viaroute_request.GetDescriptor();
const std::wstring wide_url = CA2W(url.c_str(),
CP_UTF8);
ASSERT(json_doc.HasMember("routes"));
ASSERT(json_doc["routes"].IsArray());
const rapidjson::Value &json_routes =
json_doc["routes"];
const rapidjson::SizeType num_routes =
json_routes.Size();
profile.solution.ids.resize(num_routes);
profile.solution.lts.resize(num_routes);
profile.solution.via_points.resize(num_routes);
profile.solution.routes.resize(num_routes);
for (rapidjson::SizeType r = 0; r < num_routes; ++r)
{
const rapidjson::Value &json_route =
json_routes[r];
ASSERT(json_route.IsObject());
ASSERT(json_route.HasMember("vehicle_id"));
ASSERT(json_route["vehicle_id"].IsString());
const auto driver_id =
std::stoul(json_route["vehicle_id"].GetString());
const auto &driver = _drivers.at(driver_id);
viaroute_request.Clear();
ASSERT(json_route.HasMember("paths"));
ASSERT(json_route["paths"].IsArray());
const rapidjson::Value &json_paths =
json_route["paths"];
VBD T4CH TRANG 48
const rapidjson::SizeType num_paths =
json_paths.Size();
for (rapidjson::SizeType p = 0; p < num_paths;
++p)
{
const rapidjson::Value &json_path =
json_paths[p];
ASSERT(json_path.IsObject());
ASSERT(json_path.HasMember("activity"));
ASSERT(json_path["activity"].IsString());
const std::string activity =
json_path["activity"].GetString();
ASSERT(json_path.HasMember("job"));
ASSERT(json_path["job"].IsString());
if ("start" == activity)
{
profile.solution.ids[r].push_back(driver_id);
profile.solution.lts[r].push_back(FD_LT_DRIVER);
viaroute_request.AddCoordinate(driver.address.lat,
driver.address.lon);
}
else if ("end" == activity)
{
profile.solution.ids[r].push_back(driver_id);
profile.solution.lts[r].push_back(FD_LT_DRIVER);
viaroute_request.AddCoordinate(driver.address.lat,
driver.address.lon);
}
else if ("service" == activity)
{
const auto stop_id =
std::stoul(json_path["job"].GetString());
const auto &stop = _stops.at(stop_id);
profile.solution.ids[r].push_back(stop_id);
VBD T4CH TRANG 49
profile.solution.lts[r].push_back(FD_LT_STOP);
viaroute_request.AddCoordinate(stop.address.lat,
stop.address.lon);
}
}
viaroute_request.SetAllStraights();
std::string data;
data.reserve(128);
viaroute_request.MakeData(data);
wchar_t szSize[50] = L"";
swprintf_s(szSize, L"%d", data.size());
wstring headers = L"Content-Length: ";
headers += szSize;
headers += L"\r\nContent-Type:
application/json\r\n";
_routing_http_client->UpdateUrl(wide_url);
_routing_http_client-
>SetAdditionalRequestHeaders(headers);
_routing_http_client-
>SetAdditionalDataToSend((BYTE*)data.c_str(),
data.size());
if (!_routing_http_client-
>SendHttpRequest(_T("POST"), false))
{
viaroute_status = StatusCode::Error;
break;
}
const BYTE *buffer = _routing_http_client-
>GetRawResponseContent();
if (!buffer)
{
viaroute_status = StatusCode::Error;
break;
}
rapidjson::Document json_routing_doc;
if (json_routing_doc.Parse((const
VBD T4CH TRANG 50
char*)buffer).HasParseError())
{
viaroute_status = StatusCode::Error;
break;
}
RoutingModel::Response::ViaRouteResponse
viaroute_response(json_routing_doc);
viaroute_status = viaroute_response.status;
if (StatusCode::Ok != viaroute_status)
{
break;
}
profile.solution.via_points[r] =
std::move(viaroute_response.via_points);
profile.solution.routes[r] =
std::move(viaroute_response.routes.at(0));
}
if (StatusCode::Ok != viaroute_status)
{
profile.solution.Clear();
return false;
}
// group routes by driver
for (auto r1 = 0; r1 < num_routes - 1; ++r1)
{
const auto &ids1 = profile.solution.ids[r1];
const auto driver_id1 = ids1.at(0);
auto d = driver_id1;
auto r = r1;
for (auto r2 = r1 + 1; r2 < num_routes; ++r2)
{
const auto &ids2 =
profile.solution.ids[r2];
const auto driver_id2 = ids2.at(0);
if (driver_id2 < d)
{
d = driver_id2;
r = r2;
VBD T4CH TRANG 51
}
}
if (r == r1)
{
continue;
}
auto ids = std::move(profile.solution.ids[r1]);
profile.solution.ids[r1] =
std::move(profile.solution.ids[r]);
profile.solution.ids[r] = std::move(ids);
auto lts = std::move(profile.solution.lts[r1]);
profile.solution.lts[r1] =
std::move(profile.solution.lts[r]);
profile.solution.lts[r] = std::move(lts);
auto via_points =
std::move(profile.solution.via_points[r1]);
profile.solution.via_points[r1] =
std::move(profile.solution.via_points[r]);
profile.solution.via_points[r] =
std::move(via_points);
auto route =
std::move(profile.solution.routes[r1]);
profile.solution.routes[r1] =
std::move(profile.solution.routes[r]);
profile.solution.routes[r] = std::move(route);
}
const auto &ids1 = profile.solution.ids[0];
auto driver_id1 = ids1.at(0);
const auto color_index = (_number_of_colors /
num_routes) * 0;
profile.solution.colors.push_back(_route_colors.at(
color_index));
profile.solution.ranges.push_back(0);
for (auto r = 1; r < num_routes; ++r)
{
const auto &ids2 = profile.solution.ids[r];
VBD T4CH TRANG 52
const auto driver_id2 = ids2.at(0);
const auto color_index = (_number_of_colors /
num_routes) * r;
profile.solution.colors.push_back(_route_colors.at(
color_index));
if (driver_id1 != driver_id2)
{
profile.solution.ranges.push_back(r);
driver_id1 = driver_id2;
}
}
profile.solution.ranges.push_back(num_routes);
profile.solution.visible.assign(num_routes, true);
profile.solved = true;
return true;
}