1. Trang chủ
  2. » Thể loại khác

PHẦN MỀM HỆ THỐNG OUTLINE TRUNG TÂM THÔNG TIN CHỈ HUY -VBD T4CH

52 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 52
Dung lượng 4,73 MB

Nội dung

VIETBANDO DATAWAREHOUSE TOTAL SOLUTIONS – VDTS PHẦN MỀM HỆ THỐNG OUTLINE TRUNG TÂM THÔNG TIN CHỈ HUY -VBD T4CH- MỤC LỤC PHẦN I GIỚI THIỆU PHẦN II KIẾN TRÚC HỆ THỐNG LỚP CƠ SỞ HẠ TẦNG LỚP DỮ LIỆU LỚP ỨNG DỤNG LỚP LIÊN LẠC LỚP NGƯỜI DÙNG PHẦN III BỐ TRÍ VÀ THIẾT KẾ MẠNG LƯỚI PHẦN IV CẤU TRÚC CHỨC NĂNG VBD T4CH PHẦN V CÁC CHỨC NĂNG CHÍNH 11 DỄ DÀNG TRIỂN KHAI VÀ BẢO TRÌ 11 TÍCH HỢP VỚI TRUNG TÂM TIẾP NHẬN SỰ CỐ QUA ĐIỆN THOẠI 11 CHIA SẺ THÔNG TIN HIỆU QUẢ 12 ĐỊNH VỊ TỰ ĐỘNG 12 ĐIỀU PHỐI THƠNG MINH VÀ NHANH CHĨNG 12 ĐIỀU HƯỚNG NHANH CHÓNG 12 TÍCH HỢP VỚI GPS 13 TÍCH HỢP VỚI SMS 13 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 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 HIỂN THỊ CÁC ĐỐI TƯỢNG TRACKING 37 TƯƠNG TÁC TRÊN CÁC ĐỐI TƯỢNG TRACKING 40 TÌM LỘ TRÌNH TỐI ƯU 43 DANH SÁCH HÌNH ẢNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH HÌNH KIẾN TRÚC VBD T4CH THIẾT KẾ VIỆC BỐ TRÍ MÀN HÌNH ĐĂNG NHẬP MÀN HÌNH NHẬN VÀ XỬ LÝ SỰ CỐ MÀN HÌNH THEO DÕI, GIÁM SÁT 10 MÀN HÌNH THỐNG KÊ 11 MÀN HÌNH TÍCH HỢP VỚI CCTV 14 MÀN HÌNH BẢN ĐỒ THEO CHỦ ĐỀ 15 10 THỦ TỤC XỬ LÍ TÌNH HUỐNG KHẨN CẤP 16 11 MÀN HÌNH ĐĂNG NHẬP CHƯƠNG TRÌNH 16 12 MÀN HÌNH KHỞI ĐỘNG CÔNG CỤ PHẢN ỨNG NHANH 17 13 CHỌN NGUỒN TIN 17 14 MÀN HÌNH NHẬN XỬ LÍ SỰ CỐ 18 15 MÀN HÌNH CHỌN LỰC LƯƠNG THAM GIA GIẢI QUYẾT SỰ CỐ 18 16 CẬP NHẬT THÔNG TIN HÌNH ẢNH/VIDEO VỀ HIỆN TRƯỜNG 19 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 18 GEOCODING TỪ CHUỖI ĐỊA CHỈ TÌM KIẾM 20 19 BẬT TẮT CÁC LỚP THÔNG TIN BẢN ĐỒ NỀN 20 20 CƠNG CỤ TÌM K ĐỐI TƯỢNG GẦN NHẤT 21 21 XEM THÔNG TIN CHI TIẾT ĐỐI TƯỢNG TRÊN BẢN ĐỒ 21 22 TÌM ĐƯỜNG 22 23 TÌM ĐƯỜNG TRÁNH VÙNG CẤM 22 24 KẾT QUẢ TÌM ĐƯỜNG TRÁNH VÙNG CẤM 23 25 MÀN HÌNH THEO DÕI CÁC TÀI NGUYÊN (ĐỐI TƯỢNG DI ĐỘNG) 23 26 MÀN HÌNH TRUY VẤN CÁC ĐỐI TƯỢNG DI CHUYỂN THEO BÁN KÍNH 24 27 MÀN HÌNH TRUY VẤN CÁC ĐỐI TƯỢNG DI CHUYỂN THEO VÙNG BẤT KỲ 24 28 MÀN HÌNH ĐIỀU PHỐI CÁC PHƯƠNG TIỆN VẬN CHUYỂN THEO TUYẾN 25 29 MÀN HÌNH QUẢN LÍ NGUỒN NHÂN LỰC KHI GIẢI QUYẾT SỰ CỐ 25 30 MÀN HÌNH ĐỐI THOẠI KHI GIẢI QUYẾT SỰ VỤ 26 31 BỘ BIỂU TƯỢNG SỬ DỤNG TRONG KHI GIẢI QUYẾT SỰ VỤ 26 32 MÀN HÌNH THEO CÁC CAMERA VÀ CHỨC NĂNG TỰ ĐỘNG NHẬN DIỆN CHÁY 27 33 MÀN HÌNH NHẬN DIỆN KHN MẶT 27 34 MÀN HÌNH CHỌN KỊCH BẢN GIẢI QUYẾT SỰ VỤ 28 35 MÀN HÌNH LUỒNG XỬ LÝ SỰ VỤ 28 36 MÀN HÌNH TÌM KIẾM DỰA VÀO KHUÔN MẶT TỪ FILE ẢNH 29 37 MÀN HÌNH THEO DÕI CẤU TRÚC TÒA NHÀ 3D 29 38 MÀN HÌNH DANH MỤC CÁC TÍNH NĂNG TRONG ỨNG DỤNG TRÊN MOBILE 30 39 MÀN HÌNH CHÍNH TRONG ỨNG DỤNG TRÊN MOBILE 30 40 BIỂU MẪU NHẬP MỘT SỰ VỤ MỚI TRÊN ỨNG DỤNG MOBILE 31 41 MÀN HÌNH DANH SÁCH CÁC SỰ VỤ ĐÃ NHẬP 31 42 MÀN HÌNH THIẾT LẬP CÁC LỚP DỮ LIỆU 32 43 MÀN HÌNH CHỌN LỚP DỮ LIỆU ĐỂ LÀM VIỆC 32 PHẦN I GIỚI THIỆU Các HỆ THỐNG TRUNG TÂM THÔNG TIN CHỈ HUY - VBD T4CH đại nhắm đến việc nâng cao khả phủ việc bảo vệ mạng sống tài sản công dân; an ninh quốc gia bình ổn xã hội thúc đẩy phát triển kinh tế xã hội toàn diện, có tổ chức bền vững VBD T4CH tích hợp cơng nghệ đại 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) hệ thống thông Tin địa lý (GIS), v.v VBD T4CH cung cấp giải pháp tổng thể cho tất tình khấn cấp cơng cộng quan phủ Các sản phẩm VBD T4CH nâng cao khả huy tập trung phủ, ứng phó kịp thời, phối hợp quan ban ngành Điều cải thiện tính hiệu việc tiếp nhận, xử lý tình khẩn cấp, giám sát bảo đảm tuyệt mật, lưu giữ hồ sơ an toàn tất hoạt động PHẦN II KIẾN TRÚC HỆ THỐNG Kiến trúc VBD T4CH bao gồm lớp, 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 Lớp Người Dùng (xem hình 1) Mơ tả ngắn sau: VBD T4CH TRANG Hình Kiến trúc VBD T4CH Lớp Cơ Sở Hạ Tầng Bao gồm 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, ); 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,…) hệ thống mạng (thiết kế đường dẫn cáp theo cấu trúc, chuyển mạch - switch, định tuyến - rounter, ống dẫn cáp quang,… ) VBD T4CH TRANG Lớp Dữ Liệu Được thiết kế sở liệu (CSDL) theo yêu cầu giống CSDL GIS ( gồm đồ tham chiếu, đồ đường xá, ảnh độ phân giải cao); CSDL phải lưu trữ nhật kí hồ sơ tình khẩn cấp xảy ra; Các CSDL liên quan khác CSDL hệ thống để quản lý cấu hình VBD T4CH Lớp Ứng Dụng Là nến tảng phát triển tích hợp tất mơđun chức VBD T4CH giao diện tích hợp đến hệ thống bên ngồi hữu (ví dụ gói GSM/GPRS, hệ thống CCTV, GPS,… ) Lớp Liên Lạc Được định nghĩa giao thức liên lạc sẵn có Bao gồm dịch vụ cơng cộng mạng lưới điện thoại (điện thoại di động, điện thoại cố định, Hệ thống VoIP) mạng lưới gói/điện thoại/radio tích hợp lớp Lớp người dùng Tất người dùng truy cập đến hệ thống liệt kê lớp Được phân loại thành nhóm với quyền sau: Quyền Cơng Khai (gọi báo cần giúp đỡ cố), Quyền Điều Hành (tiếp nhận gọi đến xử lí gọi đó), Quyền Giám Sát (điều khiển hệ thống VBD T4CH can thiệp để điều chỉnh sai lệch cần ), Quyền Điều Phối (phân công cho phận ứng phó xử lí tình kiểm sốt q trình), phận Ứng Phó (nhóm phải đối phó với tình trạng khẩn cấp cung cấp thơng tin VBD T4CH TRANG phản hồi) PHẦN III BỐ TRÍ VÀ THIẾT KẾ MẠNG LƯỚI Biểu đồ thể dạng bố trí điển hình VBD T4CH Nó sử dụng Trung Tâm Tiếp Nhận Cuộc Gọi Trung Tâm Giám Sát lại nhiều Trung Tâm Điều Phối Nếu cần thiết, VBD T4CH 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 Trung Tâm Điều Phối với điều chỉnh tối thiểu Hình Thiết kế việc bố trí VBD T4CH TRANG PHẦN IV CẤU TRÚC CHỨC NĂNG VBD T4CH Hệ thống VBD T4CH dạng cấu trúc bao gồm môđun chức năng:  Nhận tình khẩn cấp  Giám sát tình khẩn cấp  Điều phối tình khẩn cấp  Phản hổi tình khẩn cấp  Thống kê tình khẩn cấp  Mơđun quản trị hệ thống Tất môđun chức chạy máy chủ trung tâm Những người dùng đăng nhập sử dụng hệ thố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 chức VBD T4CH phụ thuộc vào quyền hạn người dùng Nhà quản trị hệ thống phép định điều chỉnh nhóm quyền lúc Tuy nhiên, tất người dùng chia sẻ mẫu giao diện sử dụng (cụ thể họ sử dụng chức quyền hạn mình) giảm thiểu cơng sức huấn luyện chi phí bảo trì Hình Màn hình đăng nhập Phương pháp thơng thường để báo cáo tình khẩn cấp xảy gọi trung tâm tiếp nhận khẩn cấp thông qua số điện thoại VBD T4CH TRANG khẩn cấp (thường ngắn dễ nhớ ví dụ 113, 114, ) Cũng gửi tin nhắn (SMS) đến số điện thoại khẩn cấp đó, hữu dụng số tình định Nhóm điều hành hệ thống VBD T4CH dùng mô đun Nhận Tình Huống Khẩn Cấp để xử lí cố gọi đến từ nguồn thơng tin Hình Màn hình nhận xử lý cố Nhóm Giám Sát xem lại tình diễn điều chỉnh việc sai lệch không mong muốn sử dụng chức có mơđun chức giám sát 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 phận ứng phó khẩn cấp nhận phản hồi từ phận Sau cố kết thúc phiên làm việc, chức mơ đun Phản Hồi Tình Huống Khẩn Cấp phải lưu giữ hồ sơ xuất báo cáo Hồ sơ bao gồm phản hồi từ nhóm ứng phó Nhóm Giám sát nhóm điều phối có chức mô đun Thống Kê để tạo xem qua báo cáo, đồ thị, bảng cố xảy Môđun VBD T4CH TRANG Quản Trị hệ thống VBD T4CH cho phép quản trị viên cấu hình tồn hệ thống, xác định phiên làm việc lệnh xử lí tình khẩn cấp thực thi lệnh bảo trì Hình Màn hình theo dõi, giám sát Các mơđun chức hệ thống VBD T4CH có tích hợp liền mạch với GIS Việc định vị xem đồ, chức truy vấn cung cấp từ GIS nhằm giúp quan điều hành định vị cố, giúp quan điều phối xác định vị trí tài nguyên ứng phó khẩn cấp Nhờ vào chức GIS việc lên phương án điều phối hệ thống VBD T4CH giúp quan điều phối nhanh chóng xác định nhóm ứng phó gửi nhóm đến nơi xảy tình trạng khẩn cấp Mơđun thống kê cịn tích hợp hàm dịch vụ GIS nhằm hiển thị đồ theo chủ đề thể mức độ hiệu quả, cho phép đánh giá hiệu cải thiện q trình ứng phó khẩn cấp VBD T4CH TRANG 10 { 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 COORDINATE_PRECISION; blob_req.min_lng COORDINATE_PRECISION; blob_req.max_lat = COORDINATE_PRECISION); blob_req.max_lng = COORDINATE_PRECISION); blob_req.zoom_level VBD T4CH = real_rect.top * = real_rect.left * std::ceil(real_rect.bottom * std::ceil(real_rect.right * = tile_manager- TRANG 38 >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(response); if (StatusCode::Ok == blob_res->status) { HDC hDC = pDC->GetSafeHdc(); Gdiplus::Graphics g(hDC); double vx, vy; const size_t num_blobs = >vehicle_ids.size(); assert(num_blobs == >vehicle_coords.size()); for (size_t b = 0; b < num_blobs; { const FixedPointCoordinate blob_res->vehicle_coords[b]; blob_resblob_res++b) &coord = tile_manager>TileSystem.LatLongToPixelXYDouble( coord.lat / GEOHASH_PRECISION, coord.lon / GEOHASH_PRECISION, VBD T4CH TRANG 39 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; } } Tương tá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 40 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 vtObjSel; if (m_request.WaitForResponse(req_key, m_timeout, response)) { assert(TrackingModel::Response::Type::Range == response->GetResponseType()); auto range_res = static_cast(res ponse); bool up_to_date = true; if ((m_departments.Version() < >dept_version) || (m_companies.Version() < >company_version)) { VBD T4CH range_resrange_res- TRANG 41 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::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 42 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; } Tìm lộ trình tối ưu bool Dispatch(FD_PROFILE &profile) { profile.solution.Clear(); profile.solved = false; VBD T4CH TRANG 43 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 44 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 45 allocator); json_services.PushBack(json_service, allocator); } json_body_obj.AddMember("services", json_services, allocator); rapidjson::StringBuffer json_ss; rapidjson::Writer 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 >GetRawResponseContent(); if (!buffer) { return false; } = _vrp_http_client- if char*)buffer).HasParseError()) { return false; } (json_doc.Parse((const RoutingModel::Request::ViaRouteRequest VBD T4CH TRANG 46 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 = viaroute_request.GetDescriptor(); const std::wstring wide_url CP_UTF8); _routing_http_url = + CA2W(url.c_str(), 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 47 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 48 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 49 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 50 } } 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 51 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; } VBD T4CH TRANG 52

Ngày đăng: 12/08/2020, 23:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w