From 584d0d2b0349fa555e6e4400a747475c0dc16869 Mon Sep 17 00:00:00 2001 From: yair Date: Thu, 1 Nov 2018 17:57:07 +0200 Subject: [PATCH] Save node ids in LegGeometry and inject them into the map matching response --- include/engine/api/route_api.hpp | 14 ++++++++++++++ include/engine/guidance/assemble_geometry.hpp | 15 +++++++++++++-- include/engine/guidance/leg_geometry.hpp | 2 ++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index a24277901..30a03f364 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -317,11 +317,25 @@ class RouteAPI : public BaseAPI if (requested_annotations & RouteParameters::AnnotationsType::Nodes) { util::json::Array nodes; + util::json::Array nodes_info; + nodes.values.reserve(leg_geometry.osm_node_ids.size()); + nodes_info.values.reserve(leg_geometry.osm_node_ids.size()); + + for(uint64_t i=0; i(leg_geometry.node_locations[i].lat.__value)/1000000.0; + node_info.values["longitude"] = static_cast(leg_geometry.node_locations[i].lon.__value)/1000000.0; + node_info.values["id"] = static_cast(leg_geometry.osm_node_ids[i]); + nodes_info.values.push_back(node_info); + } + for (const auto node_id : leg_geometry.osm_node_ids) { nodes.values.push_back(static_cast(node_id)); } + + annotation.values["nodes_info"] = std::move(nodes_info); annotation.values["nodes"] = std::move(nodes); } // Add any supporting metadata, if needed diff --git a/include/engine/guidance/assemble_geometry.hpp b/include/engine/guidance/assemble_geometry.hpp index eb4f9cf95..a69ab8f04 100644 --- a/include/engine/guidance/assemble_geometry.hpp +++ b/include/engine/guidance/assemble_geometry.hpp @@ -57,8 +57,12 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, const auto source_geometry_id = facade.GetGeometryIndex(source_node_id).id; const auto source_geometry = facade.GetUncompressedForwardGeometry(source_geometry_id); + const auto source_geometery_node_id = source_geometry(source_segment_start_coordinate); + Coordinate nodeCoordinate = facade.GetCoordinateOfNode(source_geometery_node_id); + geometry.node_locations.push_back(nodeCoordinate); + geometry.osm_node_ids.push_back( - facade.GetOSMNodeIDOfNode(source_geometry(source_segment_start_coordinate))); + facade.GetOSMNodeIDOfNode(source_geometery_node_id)); auto cumulative_distance = 0.; auto current_distance = 0.; @@ -81,6 +85,7 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, prev_coordinate = coordinate; const auto osm_node_id = facade.GetOSMNodeIDOfNode(path_point.turn_via_node); + Coordinate nodeLocation = facade.GetCoordinateOfNode(path_point.turn_via_node); if (osm_node_id != geometry.osm_node_ids.back() || path_point.turn_instruction.type != osrm::guidance::TurnType::NoTurn) @@ -99,6 +104,7 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, facade.GetWeightMultiplier(), path_point.datasource_id}); geometry.locations.push_back(std::move(coordinate)); + geometry.node_locations.push_back(nodeLocation); geometry.osm_node_ids.push_back(osm_node_id); } } @@ -158,12 +164,17 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, const auto target_segment_end_coordinate = target_node.fwd_segment_position + (reversed_target ? 0 : 1); const auto target_geometry = facade.GetUncompressedForwardGeometry(target_geometry_id); + + const auto target_geometry_itr = target_geometry(target_segment_end_coordinate); + Coordinate nodeLocation = facade.GetCoordinateOfNode(target_geometry_itr); + geometry.node_locations.push_back(nodeLocation); geometry.osm_node_ids.push_back( - facade.GetOSMNodeIDOfNode(target_geometry(target_segment_end_coordinate))); + facade.GetOSMNodeIDOfNode(target_geometry_itr)); BOOST_ASSERT(geometry.segment_distances.size() == geometry.segment_offsets.size() - 1); BOOST_ASSERT(geometry.locations.size() > geometry.segment_distances.size()); BOOST_ASSERT(geometry.annotations.size() == geometry.locations.size() - 1); + BOOST_ASSERT(geometry.node_locations.size() == geometry.osm_node_ids.size()); return geometry; } diff --git a/include/engine/guidance/leg_geometry.hpp b/include/engine/guidance/leg_geometry.hpp index a1ba56c81..a84a3702d 100644 --- a/include/engine/guidance/leg_geometry.hpp +++ b/include/engine/guidance/leg_geometry.hpp @@ -25,6 +25,8 @@ namespace guidance // offsets 0 2 n-1 n struct LegGeometry { + std::vector node_locations; + std::vector locations; // segment_offset[i] .. segment_offset[i+1] (inclusive) // contains the geometry of segment i