From 2f40a47529c4108f90a751f08e28e270c794f357 Mon Sep 17 00:00:00 2001 From: whytro Date: Mon, 20 Mar 2023 00:35:24 +0900 Subject: [PATCH] Add support for a default-bearing-radius flag --- include/engine/engine.hpp | 10 +++++----- include/engine/engine_config.hpp | 1 + include/engine/plugins/match.hpp | 3 ++- include/engine/plugins/nearest.hpp | 2 +- include/engine/plugins/plugin_base.hpp | 6 ++++-- include/engine/plugins/table.hpp | 2 +- include/engine/plugins/trip.hpp | 4 +++- include/engine/plugins/viaroute.hpp | 2 +- include/nodejs/node_osrm_support.hpp | 8 ++++++++ src/engine/plugins/nearest.cpp | 4 +++- src/engine/plugins/table.cpp | 3 ++- src/engine/plugins/viaroute.cpp | 3 ++- src/tools/routed.cpp | 5 ++++- test/nodejs/index.js | 6 ++++++ 14 files changed, 43 insertions(+), 16 deletions(-) diff --git a/include/engine/engine.hpp b/include/engine/engine.hpp index fcb4f2dc5..ef713b98d 100644 --- a/include/engine/engine.hpp +++ b/include/engine/engine.hpp @@ -43,11 +43,11 @@ template class Engine final : public EngineInterface { public: explicit Engine(const EngineConfig &config) - : route_plugin(config.max_locations_viaroute, config.max_alternatives), // - table_plugin(config.max_locations_distance_table), // - nearest_plugin(config.max_results_nearest), // - trip_plugin(config.max_locations_trip), // - match_plugin(config.max_locations_map_matching, config.max_radius_map_matching), // + : route_plugin(config.max_locations_viaroute, config.max_alternatives, config.default_bearing_radius), // + table_plugin(config.max_locations_distance_table, config.default_bearing_radius), // + nearest_plugin(config.max_results_nearest, config.default_bearing_radius), // + trip_plugin(config.max_locations_trip, config.default_bearing_radius), // + match_plugin(config.max_locations_map_matching, config.max_radius_map_matching, config.default_bearing_radius), // tile_plugin() // { diff --git a/include/engine/engine_config.hpp b/include/engine/engine_config.hpp index 6f4594b15..711d4152a 100644 --- a/include/engine/engine_config.hpp +++ b/include/engine/engine_config.hpp @@ -83,6 +83,7 @@ struct EngineConfig final int max_locations_map_matching = -1; double max_radius_map_matching = -1.0; int max_results_nearest = -1; + boost::optional default_bearing_radius; int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user bool use_shared_memory = true; boost::filesystem::path memory_file; diff --git a/include/engine/plugins/match.hpp b/include/engine/plugins/match.hpp index 0bb4682ba..51183f9b3 100644 --- a/include/engine/plugins/match.hpp +++ b/include/engine/plugins/match.hpp @@ -20,10 +20,11 @@ class MatchPlugin : public BasePlugin using CandidateLists = routing_algorithms::CandidateLists; static const constexpr double RADIUS_MULTIPLIER = 3; - MatchPlugin(const int max_locations_map_matching, const double max_radius_map_matching) + MatchPlugin(const int max_locations_map_matching, const double max_radius_map_matching, const boost::optional default_bearing_radius) : max_locations_map_matching(max_locations_map_matching), max_radius_map_matching(max_radius_map_matching) { + this->default_bearing_radius = default_bearing_radius; } Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, diff --git a/include/engine/plugins/nearest.hpp b/include/engine/plugins/nearest.hpp index e4c9212b2..bf1cbc254 100644 --- a/include/engine/plugins/nearest.hpp +++ b/include/engine/plugins/nearest.hpp @@ -13,7 +13,7 @@ namespace osrm::engine::plugins class NearestPlugin final : public BasePlugin { public: - explicit NearestPlugin(const int max_results); + explicit NearestPlugin(const int max_results, const boost::optional default_bearing_radius); Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, const api::NearestParameters ¶ms, diff --git a/include/engine/plugins/plugin_base.hpp b/include/engine/plugins/plugin_base.hpp index d2084ae36..3e5973869 100644 --- a/include/engine/plugins/plugin_base.hpp +++ b/include/engine/plugins/plugin_base.hpp @@ -237,7 +237,7 @@ class BasePlugin phantom_nodes[i] = facade.NearestPhantomNodes( parameters.coordinates[i], number_of_results, - use_radiuses ? parameters.radiuses[i] : boost::none, + use_radiuses ? parameters.radiuses[i] : default_bearing_radius, use_bearings ? parameters.bearings[i] : boost::none, use_approaches && parameters.approaches[i] ? parameters.approaches[i].get() : engine::Approach::UNRESTRICTED); @@ -279,7 +279,7 @@ class BasePlugin alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent( parameters.coordinates[i], - use_radiuses ? parameters.radiuses[i] : boost::none, + use_radiuses ? parameters.radiuses[i] : default_bearing_radius, use_bearings ? parameters.bearings[i] : boost::none, use_approaches && parameters.approaches[i] ? parameters.approaches[i].get() : engine::Approach::UNRESTRICTED, @@ -320,6 +320,8 @@ class BasePlugin return std::string("Could not find a matching segment for coordinate ") + std::to_string(missing_index); } + + boost::optional default_bearing_radius; }; } // namespace osrm::engine::plugins diff --git a/include/engine/plugins/table.hpp b/include/engine/plugins/table.hpp index fc8fd18eb..bca967f0a 100644 --- a/include/engine/plugins/table.hpp +++ b/include/engine/plugins/table.hpp @@ -14,7 +14,7 @@ namespace osrm::engine::plugins class TablePlugin final : public BasePlugin { public: - explicit TablePlugin(const int max_locations_distance_table); + explicit TablePlugin(const int max_locations_distance_table, const boost::optional default_bearing_radius); Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, const api::TableParameters ¶ms, diff --git a/include/engine/plugins/trip.hpp b/include/engine/plugins/trip.hpp index 01b72a38c..8718292b4 100644 --- a/include/engine/plugins/trip.hpp +++ b/include/engine/plugins/trip.hpp @@ -32,7 +32,9 @@ class TripPlugin final : public BasePlugin const bool roundtrip) const; public: - explicit TripPlugin(const int max_locations_trip_) : max_locations_trip(max_locations_trip_) {} + explicit TripPlugin(const int max_locations_trip_, const boost::optional default_bearing_radius) : max_locations_trip(max_locations_trip_) { + this->default_bearing_radius = default_bearing_radius; + } Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, const api::TripParameters ¶meters, diff --git a/include/engine/plugins/viaroute.hpp b/include/engine/plugins/viaroute.hpp index d45dd44aa..0959eab7e 100644 --- a/include/engine/plugins/viaroute.hpp +++ b/include/engine/plugins/viaroute.hpp @@ -25,7 +25,7 @@ class ViaRoutePlugin final : public BasePlugin const int max_alternatives; public: - explicit ViaRoutePlugin(int max_locations_viaroute, int max_alternatives); + explicit ViaRoutePlugin(int max_locations_viaroute, int max_alternatives, const boost::optional default_bearing_radius); Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, const api::RouteParameters &route_parameters, diff --git a/include/nodejs/node_osrm_support.hpp b/include/nodejs/node_osrm_support.hpp index a1d7b4473..3aea6f0d5 100644 --- a/include/nodejs/node_osrm_support.hpp +++ b/include/nodejs/node_osrm_support.hpp @@ -285,6 +285,7 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args) auto max_results_nearest = params.Get("max_results_nearest"); auto max_alternatives = params.Get("max_alternatives"); auto max_radius_map_matching = params.Get("max_radius_map_matching"); + auto default_bearing_radius = params.Get("default_bearing_radius"); if (!max_locations_trip.IsUndefined() && !max_locations_trip.IsNumber()) { @@ -316,6 +317,11 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args) ThrowError(args.Env(), "max_alternatives must be an integral number"); return engine_config_ptr(); } + if (!default_bearing_radius.IsUndefined() && !default_bearing_radius.IsNumber()) + { + ThrowError(args.Env(), "default_bearing_radius must be an integral number"); + return engine_config_ptr(); + } if (max_locations_trip.IsNumber()) engine_config->max_locations_trip = max_locations_trip.ToNumber().Int32Value(); @@ -333,6 +339,8 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args) engine_config->max_alternatives = max_alternatives.ToNumber().Int32Value(); if (max_radius_map_matching.IsNumber()) engine_config->max_radius_map_matching = max_radius_map_matching.ToNumber().DoubleValue(); + if (default_bearing_radius.IsNumber()) + engine_config->default_bearing_radius = default_bearing_radius.ToNumber().DoubleValue(); return engine_config; } diff --git a/src/engine/plugins/nearest.cpp b/src/engine/plugins/nearest.cpp index bd6dd8e54..89d1b0c96 100644 --- a/src/engine/plugins/nearest.cpp +++ b/src/engine/plugins/nearest.cpp @@ -10,7 +10,9 @@ namespace osrm::engine::plugins { -NearestPlugin::NearestPlugin(const int max_results_) : max_results{max_results_} {} +NearestPlugin::NearestPlugin(const int max_results_, const boost::optional default_bearing_radius_) : max_results{max_results_} { + this->default_bearing_radius = default_bearing_radius_; +} Status NearestPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, const api::NearestParameters ¶ms, diff --git a/src/engine/plugins/table.cpp b/src/engine/plugins/table.cpp index 150cefb34..731f92b40 100644 --- a/src/engine/plugins/table.cpp +++ b/src/engine/plugins/table.cpp @@ -14,9 +14,10 @@ namespace osrm::engine::plugins { -TablePlugin::TablePlugin(const int max_locations_distance_table) +TablePlugin::TablePlugin(const int max_locations_distance_table, const boost::optional default_bearing_radius) : max_locations_distance_table(max_locations_distance_table) { + this->default_bearing_radius = default_bearing_radius; } Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, diff --git a/src/engine/plugins/viaroute.cpp b/src/engine/plugins/viaroute.cpp index aa533d96a..dc8ff83f6 100644 --- a/src/engine/plugins/viaroute.cpp +++ b/src/engine/plugins/viaroute.cpp @@ -15,9 +15,10 @@ namespace osrm::engine::plugins { -ViaRoutePlugin::ViaRoutePlugin(int max_locations_viaroute, int max_alternatives) +ViaRoutePlugin::ViaRoutePlugin(int max_locations_viaroute, int max_alternatives, const boost::optional default_bearing_radius) : max_locations_viaroute(max_locations_viaroute), max_alternatives(max_alternatives) { + this->default_bearing_radius = default_bearing_radius; } Status ViaRoutePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, diff --git a/src/tools/routed.cpp b/src/tools/routed.cpp index 943475052..3f7c82035 100644 --- a/src/tools/routed.cpp +++ b/src/tools/routed.cpp @@ -147,7 +147,10 @@ inline unsigned generateServerProgramOptions(const int argc, "Max. number of alternatives supported in the MLD route query") // ("max-matching-radius", value(&config.max_radius_map_matching)->default_value(-1.0), - "Max. radius size supported in map matching query. Default: unlimited."); + "Max. radius size supported in map matching query. Default: unlimited.") // + ("default-bearings-radius", + value>(&config.default_bearing_radius), + "Default radius size for queries with bearings. Default: unlimited."); // hidden options, will be allowed on command line, but will not be shown to the user boost::program_options::options_description hidden_options("Hidden options"); diff --git a/test/nodejs/index.js b/test/nodejs/index.js index f08356706..e37fd019b 100644 --- a/test/nodejs/index.js +++ b/test/nodejs/index.js @@ -112,6 +112,12 @@ test('constructor: throws if dataset_name is not a string', function(assert) { assert.throws(function() { new OSRM({dataset_name: "unsued_name___", shared_memory: true}); }, /Could not find shared memory region/, 'Does not accept wrong name'); }); +test('constructor: takes a default_bearing_radius argument', function(assert) { + assert.plan(1); + var osrm = new OSRM({default_bearing_radius: 1}); + assert.ok(osrm); +}); + test('constructor: parses custom limits', function(assert) { assert.plan(1); var osrm = new OSRM({