Save node ids in LegGeometry and inject them into the map matching response

This commit is contained in:
yair 2018-11-01 17:57:07 +02:00
parent cb1db646f2
commit 584d0d2b03
3 changed files with 29 additions and 2 deletions

View File

@ -317,11 +317,25 @@ class RouteAPI : public BaseAPI
if (requested_annotations & RouteParameters::AnnotationsType::Nodes) if (requested_annotations & RouteParameters::AnnotationsType::Nodes)
{ {
util::json::Array nodes; util::json::Array nodes;
util::json::Array nodes_info;
nodes.values.reserve(leg_geometry.osm_node_ids.size()); 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.size(); i++) {
util::json::Object node_info;
node_info.values["latitude"] = static_cast<std::double_t >(leg_geometry.node_locations[i].lat.__value)/1000000.0;
node_info.values["longitude"] = static_cast<std::double_t >(leg_geometry.node_locations[i].lon.__value)/1000000.0;
node_info.values["id"] = static_cast<std::uint64_t>(leg_geometry.osm_node_ids[i]);
nodes_info.values.push_back(node_info);
}
for (const auto node_id : leg_geometry.osm_node_ids) for (const auto node_id : leg_geometry.osm_node_ids)
{ {
nodes.values.push_back(static_cast<std::uint64_t>(node_id)); nodes.values.push_back(static_cast<std::uint64_t>(node_id));
} }
annotation.values["nodes_info"] = std::move(nodes_info);
annotation.values["nodes"] = std::move(nodes); annotation.values["nodes"] = std::move(nodes);
} }
// Add any supporting metadata, if needed // Add any supporting metadata, if needed

View File

@ -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_id = facade.GetGeometryIndex(source_node_id).id;
const auto source_geometry = facade.GetUncompressedForwardGeometry(source_geometry_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( 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 cumulative_distance = 0.;
auto current_distance = 0.; auto current_distance = 0.;
@ -81,6 +85,7 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade,
prev_coordinate = coordinate; prev_coordinate = coordinate;
const auto osm_node_id = facade.GetOSMNodeIDOfNode(path_point.turn_via_node); 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() || if (osm_node_id != geometry.osm_node_ids.back() ||
path_point.turn_instruction.type != osrm::guidance::TurnType::NoTurn) path_point.turn_instruction.type != osrm::guidance::TurnType::NoTurn)
@ -99,6 +104,7 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade,
facade.GetWeightMultiplier(), facade.GetWeightMultiplier(),
path_point.datasource_id}); path_point.datasource_id});
geometry.locations.push_back(std::move(coordinate)); geometry.locations.push_back(std::move(coordinate));
geometry.node_locations.push_back(nodeLocation);
geometry.osm_node_ids.push_back(osm_node_id); 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 = const auto target_segment_end_coordinate =
target_node.fwd_segment_position + (reversed_target ? 0 : 1); target_node.fwd_segment_position + (reversed_target ? 0 : 1);
const auto target_geometry = facade.GetUncompressedForwardGeometry(target_geometry_id); 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( 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.segment_distances.size() == geometry.segment_offsets.size() - 1);
BOOST_ASSERT(geometry.locations.size() > geometry.segment_distances.size()); BOOST_ASSERT(geometry.locations.size() > geometry.segment_distances.size());
BOOST_ASSERT(geometry.annotations.size() == geometry.locations.size() - 1); BOOST_ASSERT(geometry.annotations.size() == geometry.locations.size() - 1);
BOOST_ASSERT(geometry.node_locations.size() == geometry.osm_node_ids.size());
return geometry; return geometry;
} }

View File

@ -25,6 +25,8 @@ namespace guidance
// offsets 0 2 n-1 n // offsets 0 2 n-1 n
struct LegGeometry struct LegGeometry
{ {
std::vector<util::Coordinate> node_locations;
std::vector<util::Coordinate> locations; std::vector<util::Coordinate> locations;
// segment_offset[i] .. segment_offset[i+1] (inclusive) // segment_offset[i] .. segment_offset[i+1] (inclusive)
// contains the geometry of segment i // contains the geometry of segment i