From 097771879b717d3ba8feba7744592d14eae78a99 Mon Sep 17 00:00:00 2001 From: "Daniel J. Hofmann" Date: Wed, 17 Feb 2016 13:49:44 -0800 Subject: [PATCH] Adapts Nearest plugin to new API --- include/engine/plugins/nearest.hpp | 87 +------------------ include/engine/plugins/table.hpp | 10 +-- .../routing_algorithms/map_matching.hpp | 4 +- src/engine/engine.cpp | 24 ++++- src/engine/plugins/nearest.cpp | 87 +++++++++++++++++++ src/engine/plugins/table.cpp | 6 +- src/tools/routed.cpp | 2 +- 7 files changed, 122 insertions(+), 98 deletions(-) diff --git a/include/engine/plugins/nearest.hpp b/include/engine/plugins/nearest.hpp index 5f94ce735..103b789c0 100644 --- a/include/engine/plugins/nearest.hpp +++ b/include/engine/plugins/nearest.hpp @@ -2,12 +2,9 @@ #define NEAREST_HPP #include "engine/plugins/plugin_base.hpp" -#include "engine/phantom_node.hpp" -#include "util/integer_range.hpp" +#include "engine/api/nearest_parameters.hpp" #include "osrm/json_container.hpp" -#include - namespace osrm { namespace engine @@ -15,90 +12,12 @@ namespace engine namespace plugins { -/* - * This Plugin locates the nearest point on a street in the road network for a given coordinate. - */ - class NearestPlugin final : public BasePlugin { public: - explicit NearestPlugin(DataFacadeT *facade) : facade(facade), descriptor_string("nearest") {} + explicit NearestPlugin(datafacade::BaseDataFacade &facade); - const std::string GetDescriptor() const override final { return descriptor_string; } - - Status HandleRequest(const RouteParameters &route_parameters, - util::json::Object &json_result) override final - { - // check number of parameters - if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().IsValid()) - { - return Status::Error; - } - - const auto &input_bearings = route_parameters.bearings; - if (input_bearings.size() > 0 && - route_parameters.coordinates.size() != input_bearings.size()) - { - json_result.values["status_message"] = - "Number of bearings does not match number of coordinates"; - return Status::Error; - } - - auto number_of_results = static_cast(route_parameters.num_results); - const int bearing = input_bearings.size() > 0 ? input_bearings.front().first : 0; - const int range = - input_bearings.size() > 0 - ? (input_bearings.front().second ? *input_bearings.front().second : 10) - : 180; - auto phantom_node_vector = facade->NearestPhantomNodes(route_parameters.coordinates.front(), - number_of_results, bearing, range); - - if (phantom_node_vector.empty()) - { - json_result.values["status_message"] = - std::string("Could not find a matching segments for coordinate"); - return Status::NoSegment; - } - else - { - json_result.values["status_message"] = "Found nearest edge"; - if (number_of_results > 1) - { - util::json::Array results; - - auto vector_length = phantom_node_vector.size(); - for (const auto i : - util::irange(0, std::min(number_of_results, vector_length))) - { - const auto &node = phantom_node_vector[i].phantom_node; - util::json::Array json_coordinate; - util::json::Object result; - json_coordinate.values.push_back(node.location.lat / COORDINATE_PRECISION); - json_coordinate.values.push_back(node.location.lon / COORDINATE_PRECISION); - result.values["mapped coordinate"] = json_coordinate; - result.values["name"] = facade->get_name_for_id(node.name_id); - results.values.push_back(result); - } - json_result.values["results"] = results; - } - else - { - util::json::Array json_coordinate; - json_coordinate.values.push_back( - phantom_node_vector.front().phantom_node.location.lat / COORDINATE_PRECISION); - json_coordinate.values.push_back( - phantom_node_vector.front().phantom_node.location.lon / COORDINATE_PRECISION); - json_result.values["mapped_coordinate"] = json_coordinate; - json_result.values["name"] = - facade->get_name_for_id(phantom_node_vector.front().phantom_node.name_id); - } - } - return Status::Ok; - } - - private: - DataFacadeT *facade; - std::string descriptor_string; + Status HandleRequest(const api::NearestParameters ¶ms, util::json::Object &result); }; } } diff --git a/include/engine/plugins/table.hpp b/include/engine/plugins/table.hpp index 15fd076f5..09f9761ae 100644 --- a/include/engine/plugins/table.hpp +++ b/include/engine/plugins/table.hpp @@ -17,16 +17,16 @@ namespace plugins class TablePlugin final : public BasePlugin { - private: - SearchEngineData heaps; - routing_algorithms::ManyToManyRouting distance_table; - int max_locations_distance_table; - public: explicit TablePlugin(datafacade::BaseDataFacade &facade, const int max_locations_distance_table); Status HandleRequest(const api::TableParameters ¶ms, util::json::Object &result); + + private: + SearchEngineData heaps; + routing_algorithms::ManyToManyRouting distance_table; + int max_locations_distance_table; }; } } diff --git a/include/engine/routing_algorithms/map_matching.hpp b/include/engine/routing_algorithms/map_matching.hpp index 34e16f18e..97472f74f 100644 --- a/include/engine/routing_algorithms/map_matching.hpp +++ b/include/engine/routing_algorithms/map_matching.hpp @@ -83,7 +83,7 @@ class MapMatching final : public BasicRoutingInterface 1; - const auto median_sample_time = [&]() + const auto median_sample_time = [&] { if (use_timestamps) { @@ -95,7 +95,7 @@ class MapMatching final : public BasicRoutingInterface +#include + +#include + +namespace osrm +{ +namespace engine +{ +namespace plugins +{ + +NearestPlugin::NearestPlugin(datafacade::BaseDataFacade &facade) : BasePlugin{facade} {} + +Status NearestPlugin::HandleRequest(const api::NearestParameters ¶ms, + util::json::Object &result) +{ + BOOST_ASSERT(params.IsValid()); + + if (!CheckAllCoordinates(params.coordinates)) + return Error("invalid-options", "Coordinates are invalid", result); + + if (params.bearings.size() > 0 && params.coordinates.size() != params.bearings.size()) + return Error("invalid-options", "Number of bearings does not match number of coordinates", + result); + + const auto &input_bearings = params.bearings; + auto number_of_results = static_cast(params.number_of_results); + + /* TODO(daniel-j-h): bearing range? + const int bearing = input_bearings.size() > 0 ? input_bearings.front().first : 0; + const int range = input_bearings.size() > 0 + ? (input_bearings.front().second ? *input_bearings.front().second : 10) + : 180; + auto phantom_node_vector = + facade.NearestPhantomNodes(params.coordinates.front(), number_of_results, bearing, range); + + if (phantom_node_vector.empty()) + { + result.values["status_message"] = + std::string("Could not find a matching segments for coordinate"); + return Status::NoSegment; + } + else + { + result.values["status_message"] = "Found nearest edge"; + if (number_of_results > 1) + { + util::json::Array results; + + auto vector_length = phantom_node_vector.size(); + for (const auto i : + util::irange(0, std::min(number_of_results, vector_length))) + { + const auto &node = phantom_node_vector[i].phantom_node; + util::json::Array json_coordinate; + util::json::Object result; + json_coordinate.values.push_back(node.location.lat / COORDINATE_PRECISION); + json_coordinate.values.push_back(node.location.lon / COORDINATE_PRECISION); + result.values["mapped coordinate"] = json_coordinate; + result.values["name"] = facade.get_name_for_id(node.name_id); + results.values.push_back(result); + } + result.values["results"] = results; + } + else + { + util::json::Array json_coordinate; + json_coordinate.values.push_back(phantom_node_vector.front().phantom_node.location.lat / + COORDINATE_PRECISION); + json_coordinate.values.push_back(phantom_node_vector.front().phantom_node.location.lon / + COORDINATE_PRECISION); + result.values["mapped_coordinate"] = json_coordinate; + result.values["name"] = + facade.get_name_for_id(phantom_node_vector.front().phantom_node.name_id); + } + } + */ + return Status::Ok; +} +} +} +} diff --git a/src/engine/plugins/table.cpp b/src/engine/plugins/table.cpp index e4231d572..6cfef8dea 100644 --- a/src/engine/plugins/table.cpp +++ b/src/engine/plugins/table.cpp @@ -15,6 +15,8 @@ #include #include +#include + namespace osrm { namespace engine @@ -58,7 +60,7 @@ Status TablePlugin::HandleRequest(const api::TableParameters ¶ms, util::json auto snapped_phantoms = SnapPhantomNodes(GetPhantomNodes(params)); - const auto result_table = [&]() + const auto result_table = [&] { if (params.sources.empty()) { @@ -76,7 +78,7 @@ Status TablePlugin::HandleRequest(const api::TableParameters ¶ms, util::json return Error("no-table", "No table found", result); } - api::TableAPI table_api {facade, params}; + api::TableAPI table_api{facade, params}; table_api.MakeResponse(result_table, snapped_phantoms, result); return Status::Ok; diff --git a/src/tools/routed.cpp b/src/tools/routed.cpp index f8b98e8c0..c91530850 100644 --- a/src/tools/routed.cpp +++ b/src/tools/routed.cpp @@ -113,7 +113,7 @@ int main(int argc, const char *argv[]) try } else { - std::packaged_task server_task([&]() -> int + std::packaged_task server_task([&] { routing_server->Run(); return 0;