Save node ids in LegGeometry and inject them into the map matching response
This commit is contained in:
parent
cb1db646f2
commit
584d0d2b03
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user