diff --git a/include/engine/api/flatbuffers/route.fbs b/include/engine/api/flatbuffers/route.fbs index 902bfa199..ba53cc582 100644 --- a/include/engine/api/flatbuffers/route.fbs +++ b/include/engine/api/flatbuffers/route.fbs @@ -10,6 +10,8 @@ table Annotation { duration: [uint]; datasources: [uint]; nodes: [uint]; + osm_nodes: [ulong]; + weight: [uint]; speed: [float]; metadata: Metadata; diff --git a/include/engine/api/nearest_api.hpp b/include/engine/api/nearest_api.hpp index 43c42de29..0f65deb2b 100644 --- a/include/engine/api/nearest_api.hpp +++ b/include/engine/api/nearest_api.hpp @@ -7,6 +7,7 @@ #include "engine/api/json_factory.hpp" #include "engine/phantom_node.hpp" +#include "util/json_container.hpp" #include @@ -110,6 +111,11 @@ class NearestAPI final : public BaseAPI nodes.values.push_back(node_values.second); waypoint.values["nodes"] = std::move(nodes); + util::json::Array osm_nodes; + osm_nodes.values.emplace_back(std::to_string(node_values.first)); + osm_nodes.values.emplace_back(std::to_string(node_values.second)); + waypoint.values["osm_nodes"] = std::move(osm_nodes); + return waypoint; }); response.values["waypoints"] = std::move(waypoints); diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index e72a4af86..1141ab27e 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -28,6 +28,7 @@ #include "util/json_util.hpp" #include +#include #include namespace osrm @@ -822,14 +823,43 @@ class RouteAPI : public BaseAPI return anno.datasource; }); } - if (requested_annotations & RouteParameters::AnnotationsType::Nodes) + if (requested_annotations & RouteParameters::AnnotationsType::Nodes || + requested_annotations & RouteParameters::AnnotationsType::OSMNodes) + { + util::json::Array nodes; + util::json::Array osm_nodes; + + nodes.values.reserve(leg_geometry.node_ids.size()); + for (const auto node_id : leg_geometry.node_ids) + { + const auto osm_node_id = + static_cast(facade.GetOSMNodeIDOfNode(node_id)); + if (requested_annotations & RouteParameters::AnnotationsType::Nodes) + { + nodes.values.emplace_back(osm_node_id); + } + if (requested_annotations & RouteParameters::AnnotationsType::OSMNodes) + { + osm_nodes.values.emplace_back(osm_node_id); + } + } + if (requested_annotations & RouteParameters::AnnotationsType::Nodes) + { + annotation.values["nodes"] = nodes; + } + if (requested_annotations & RouteParameters::AnnotationsType::OSMNodes) + { + annotation.values["osmnodes"] = osm_nodes; + } + } + if (requested_annotations & RouteParameters::AnnotationsType::OSMNodes) { util::json::Array nodes; nodes.values.reserve(leg_geometry.node_ids.size()); for (const auto node_id : leg_geometry.node_ids) { - nodes.values.push_back( - static_cast(facade.GetOSMNodeIDOfNode(node_id))); + nodes.values.push_back(std::to_string( + static_cast(facade.GetOSMNodeIDOfNode(node_id)))); } annotation.values["nodes"] = std::move(nodes); } diff --git a/include/engine/api/route_parameters.hpp b/include/engine/api/route_parameters.hpp index 8d5dd9ae4..6aec0d9fd 100644 --- a/include/engine/api/route_parameters.hpp +++ b/include/engine/api/route_parameters.hpp @@ -70,13 +70,14 @@ struct RouteParameters : public BaseParameters enum class AnnotationsType { None = 0, - Duration = 0x01, - Nodes = 0x02, - Distance = 0x04, - Weight = 0x08, - Datasources = 0x10, - Speed = 0x20, - All = Duration | Nodes | Distance | Weight | Datasources | Speed + Duration = 1 << 1, + Nodes = 1 << 2, + Distance = 1 << 3, + Weight = 1 << 4, + Datasources = 1 << 5, + Speed = 1 << 6, + OSMNodes = 1 << 7, + All = Duration | Nodes | Distance | Weight | Datasources | Speed | OSMNodes }; RouteParameters() = default; diff --git a/include/nodejs/node_osrm_support.hpp b/include/nodejs/node_osrm_support.hpp index 25f96661d..18ed3ef37 100644 --- a/include/nodejs/node_osrm_support.hpp +++ b/include/nodejs/node_osrm_support.hpp @@ -778,6 +778,11 @@ inline bool parseCommonParameters(const v8::Local &obj, ParamType &p params->annotations_type = params->annotations_type | osrm::RouteParameters::AnnotationsType::Nodes; } + else if (annotations_str == "osm_nodes") + { + params->annotations_type = + params->annotations_type | osrm::RouteParameters::AnnotationsType::OSMNodes; + } else if (annotations_str == "distance") { params->annotations_type = diff --git a/include/server/api/route_parameters_grammar.hpp b/include/server/api/route_parameters_grammar.hpp index df5fb52df..976b96a91 100644 --- a/include/server/api/route_parameters_grammar.hpp +++ b/include/server/api/route_parameters_grammar.hpp @@ -73,8 +73,8 @@ struct RouteParametersGrammar : public BaseParametersGrammar