Skip to content

Commit 2391ab5

Browse files
committed
Add support for a default_bearing_radius flag (#6575)
1 parent 24c13da commit 2391ab5

File tree

19 files changed

+95
-34
lines changed

19 files changed

+95
-34
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Unreleased
22
- Changes from 5.27.1
3+
- Features
4+
- ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
35
- Build:
46
- ADDED: Add CI job which builds OSRM with gcc 12. [#6455](https://github.com/Project-OSRM/osrm-backend/pull/6455)
57
- CHANGED: Upgrade to clang-tidy 15. [#6439](https://github.com/Project-OSRM/osrm-backend/pull/6439)

docs/nodejs/api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var osrm = new OSRM('network.osrm');
3838
- `options.max_radius_map_matching` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. radius size supported in map matching query (default: 5).
3939
- `options.max_results_nearest` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. results supported in nearest query (default: unlimited).
4040
- `options.max_alternatives` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. number of alternatives supported in alternative routes query (default: 3).
41+
- `options.default_radius` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Default radius for queries (default: unlimited).
4142

4243
### route
4344

features/options/routed/help.feature

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Feature: osrm-routed command line options: help
2222
And stdout should contain "--max-trip-size"
2323
And stdout should contain "--max-table-size"
2424
And stdout should contain "--max-matching-size"
25+
And stdout should contain "--default-radius"
2526
And it should exit successfully
2627

2728
Scenario: osrm-routed - Help, short
@@ -42,6 +43,7 @@ Feature: osrm-routed command line options: help
4243
And stdout should contain "--max-trip-size"
4344
And stdout should contain "--max-table-size"
4445
And stdout should contain "--max-matching-size"
46+
And stdout should contain "--default-radius"
4547
And it should exit successfully
4648

4749
Scenario: osrm-routed - Help, long
@@ -62,4 +64,5 @@ Feature: osrm-routed command line options: help
6264
And stdout should contain "--max-table-size"
6365
And stdout should contain "--max-table-size"
6466
And stdout should contain "--max-matching-size"
67+
And stdout should contain "--default-radius"
6568
And it should exit successfully

include/engine/engine.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,16 @@ template <typename Algorithm> class Engine final : public EngineInterface
4343
{
4444
public:
4545
explicit Engine(const EngineConfig &config)
46-
: route_plugin(config.max_locations_viaroute, config.max_alternatives), //
47-
table_plugin(config.max_locations_distance_table), //
48-
nearest_plugin(config.max_results_nearest), //
49-
trip_plugin(config.max_locations_trip), //
50-
match_plugin(config.max_locations_map_matching, config.max_radius_map_matching), //
51-
tile_plugin() //
46+
: route_plugin(config.max_locations_viaroute,
47+
config.max_alternatives,
48+
config.default_radius), //
49+
table_plugin(config.max_locations_distance_table, config.default_radius), //
50+
nearest_plugin(config.max_results_nearest, config.default_radius), //
51+
trip_plugin(config.max_locations_trip, config.default_radius), //
52+
match_plugin(config.max_locations_map_matching,
53+
config.max_radius_map_matching,
54+
config.default_radius), //
55+
tile_plugin() //
5256

5357
{
5458
if (config.use_shared_memory)

include/engine/engine_config.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ struct EngineConfig final
8383
int max_locations_map_matching = -1;
8484
double max_radius_map_matching = -1.0;
8585
int max_results_nearest = -1;
86+
boost::optional<double> default_radius;
8687
int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user
8788
bool use_shared_memory = true;
8889
boost::filesystem::path memory_file;

include/engine/plugins/match.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ class MatchPlugin : public BasePlugin
2020
using CandidateLists = routing_algorithms::CandidateLists;
2121
static const constexpr double RADIUS_MULTIPLIER = 3;
2222

23-
MatchPlugin(const int max_locations_map_matching, const double max_radius_map_matching)
24-
: max_locations_map_matching(max_locations_map_matching),
23+
MatchPlugin(const int max_locations_map_matching,
24+
const double max_radius_map_matching,
25+
const boost::optional<double> default_radius)
26+
: BasePlugin(default_radius), max_locations_map_matching(max_locations_map_matching),
2527
max_radius_map_matching(max_radius_map_matching)
2628
{
2729
}

include/engine/plugins/nearest.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace osrm::engine::plugins
1313
class NearestPlugin final : public BasePlugin
1414
{
1515
public:
16-
explicit NearestPlugin(const int max_results);
16+
explicit NearestPlugin(const int max_results, const boost::optional<double> default_radius);
1717

1818
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
1919
const api::NearestParameters &params,

include/engine/plugins/plugin_base.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ namespace osrm::engine::plugins
2727
class BasePlugin
2828
{
2929
protected:
30+
BasePlugin() = default;
31+
32+
BasePlugin(const boost::optional<double> default_radius_) : default_radius(default_radius_) {}
33+
3034
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const
3135
{
3236
return !std::any_of(
@@ -237,7 +241,7 @@ class BasePlugin
237241
phantom_nodes[i] = facade.NearestPhantomNodes(
238242
parameters.coordinates[i],
239243
number_of_results,
240-
use_radiuses ? parameters.radiuses[i] : boost::none,
244+
use_radiuses ? parameters.radiuses[i] : default_radius,
241245
use_bearings ? parameters.bearings[i] : boost::none,
242246
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
243247
: engine::Approach::UNRESTRICTED);
@@ -279,7 +283,7 @@ class BasePlugin
279283

280284
alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent(
281285
parameters.coordinates[i],
282-
use_radiuses ? parameters.radiuses[i] : boost::none,
286+
use_radiuses ? parameters.radiuses[i] : default_radius,
283287
use_bearings ? parameters.bearings[i] : boost::none,
284288
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
285289
: engine::Approach::UNRESTRICTED,
@@ -320,6 +324,8 @@ class BasePlugin
320324
return std::string("Could not find a matching segment for coordinate ") +
321325
std::to_string(missing_index);
322326
}
327+
328+
const boost::optional<double> default_radius;
323329
};
324330
} // namespace osrm::engine::plugins
325331

include/engine/plugins/table.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ namespace osrm::engine::plugins
1414
class TablePlugin final : public BasePlugin
1515
{
1616
public:
17-
explicit TablePlugin(const int max_locations_distance_table);
17+
explicit TablePlugin(const int max_locations_distance_table,
18+
const boost::optional<double> default_radius);
1819

1920
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
2021
const api::TableParameters &params,

include/engine/plugins/trip.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ class TripPlugin final : public BasePlugin
3232
const bool roundtrip) const;
3333

3434
public:
35-
explicit TripPlugin(const int max_locations_trip_) : max_locations_trip(max_locations_trip_) {}
35+
explicit TripPlugin(const int max_locations_trip_, boost::optional<double> default_radius)
36+
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
37+
{
38+
}
3639

3740
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
3841
const api::TripParameters &parameters,

include/engine/plugins/viaroute.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ class ViaRoutePlugin final : public BasePlugin
2525
const int max_alternatives;
2626

2727
public:
28-
explicit ViaRoutePlugin(int max_locations_viaroute, int max_alternatives);
28+
explicit ViaRoutePlugin(int max_locations_viaroute,
29+
int max_alternatives,
30+
boost::optional<double> default_radius);
2931

3032
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
3133
const api::RouteParameters &route_parameters,

include/nodejs/node_osrm_support.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
285285
auto max_results_nearest = params.Get("max_results_nearest");
286286
auto max_alternatives = params.Get("max_alternatives");
287287
auto max_radius_map_matching = params.Get("max_radius_map_matching");
288+
auto default_radius = params.Get("default_radius");
288289

289290
if (!max_locations_trip.IsUndefined() && !max_locations_trip.IsNumber())
290291
{
@@ -316,6 +317,11 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
316317
ThrowError(args.Env(), "max_alternatives must be an integral number");
317318
return engine_config_ptr();
318319
}
320+
if (!default_radius.IsUndefined() && !default_radius.IsNumber())
321+
{
322+
ThrowError(args.Env(), "default_radius must be an integral number");
323+
return engine_config_ptr();
324+
}
319325

320326
if (max_locations_trip.IsNumber())
321327
engine_config->max_locations_trip = max_locations_trip.ToNumber().Int32Value();
@@ -333,6 +339,8 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
333339
engine_config->max_alternatives = max_alternatives.ToNumber().Int32Value();
334340
if (max_radius_map_matching.IsNumber())
335341
engine_config->max_radius_map_matching = max_radius_map_matching.ToNumber().DoubleValue();
342+
if (default_radius.IsNumber())
343+
engine_config->default_radius = default_radius.ToNumber().DoubleValue();
336344

337345
return engine_config;
338346
}

src/engine/plugins/match.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -181,24 +181,29 @@ Status MatchPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
181181
if (tidied.parameters.radiuses.empty())
182182
{
183183
search_radiuses.resize(tidied.parameters.coordinates.size(),
184-
routing_algorithms::DEFAULT_GPS_PRECISION * RADIUS_MULTIPLIER);
184+
default_radius.has_value()
185+
? *default_radius
186+
: routing_algorithms::DEFAULT_GPS_PRECISION * RADIUS_MULTIPLIER);
185187
}
186188
else
187189
{
188190
search_radiuses.resize(tidied.parameters.coordinates.size());
189-
std::transform(tidied.parameters.radiuses.begin(),
190-
tidied.parameters.radiuses.end(),
191-
search_radiuses.begin(),
192-
[](const boost::optional<double> &maybe_radius) {
193-
if (maybe_radius)
194-
{
195-
return *maybe_radius * RADIUS_MULTIPLIER;
196-
}
197-
else
198-
{
199-
return routing_algorithms::DEFAULT_GPS_PRECISION * RADIUS_MULTIPLIER;
200-
}
201-
});
191+
std::transform(
192+
tidied.parameters.radiuses.begin(),
193+
tidied.parameters.radiuses.end(),
194+
search_radiuses.begin(),
195+
[default_radius = this->default_radius](const boost::optional<double> &maybe_radius) {
196+
if (maybe_radius)
197+
{
198+
return *maybe_radius * RADIUS_MULTIPLIER;
199+
}
200+
else
201+
{
202+
return default_radius.has_value()
203+
? *default_radius
204+
: routing_algorithms::DEFAULT_GPS_PRECISION * RADIUS_MULTIPLIER;
205+
}
206+
});
202207
}
203208

204209
auto candidates_lists =

src/engine/plugins/nearest.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
namespace osrm::engine::plugins
1111
{
1212

13-
NearestPlugin::NearestPlugin(const int max_results_) : max_results{max_results_} {}
13+
NearestPlugin::NearestPlugin(const int max_results_, const boost::optional<double> default_radius_)
14+
: BasePlugin(default_radius_), max_results{max_results_}
15+
{
16+
}
1417

1518
Status NearestPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
1619
const api::NearestParameters &params,

src/engine/plugins/table.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
namespace osrm::engine::plugins
1515
{
1616

17-
TablePlugin::TablePlugin(const int max_locations_distance_table)
18-
: max_locations_distance_table(max_locations_distance_table)
17+
TablePlugin::TablePlugin(const int max_locations_distance_table,
18+
const boost::optional<double> default_radius)
19+
: BasePlugin(default_radius), max_locations_distance_table(max_locations_distance_table)
1920
{
2021
}
2122

src/engine/plugins/viaroute.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
namespace osrm::engine::plugins
1616
{
1717

18-
ViaRoutePlugin::ViaRoutePlugin(int max_locations_viaroute, int max_alternatives)
19-
: max_locations_viaroute(max_locations_viaroute), max_alternatives(max_alternatives)
18+
ViaRoutePlugin::ViaRoutePlugin(int max_locations_viaroute,
19+
int max_alternatives,
20+
boost::optional<double> default_radius)
21+
: BasePlugin(default_radius), max_locations_viaroute(max_locations_viaroute),
22+
max_alternatives(max_alternatives)
2023
{
2124
}
2225

src/nodejs/node_osrm.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ Napi::Object Engine::Init(Napi::Env env, Napi::Object exports)
8181
* @param {Number} [options.max_radius_map_matching] Max. radius size supported in map matching query (default: 5).
8282
* @param {Number} [options.max_results_nearest] Max. results supported in nearest query (default: unlimited).
8383
* @param {Number} [options.max_alternatives] Max. number of alternatives supported in alternative routes query (default: 3).
84+
* @param {Number} [options.default_radius] Default radius for queries (default: unlimited).
8485
*
8586
* @class OSRM
8687
*

src/tools/routed.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ inline unsigned generateServerProgramOptions(const int argc,
147147
"Max. number of alternatives supported in the MLD route query") //
148148
("max-matching-radius",
149149
value<double>(&config.max_radius_map_matching)->default_value(-1.0),
150-
"Max. radius size supported in map matching query. Default: unlimited.");
150+
"Max. radius size supported in map matching query. Default: unlimited.") //
151+
("default-radius",
152+
value<boost::optional<double>>(&config.default_radius),
153+
"Default radius size for queries. Default: unlimited.");
151154

152155
// hidden options, will be allowed on command line, but will not be shown to the user
153156
boost::program_options::options_description hidden_options("Hidden options");

test/nodejs/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,18 @@ test('constructor: throws if dataset_name is not a string', function(assert) {
112112
assert.throws(function() { new OSRM({dataset_name: "unsued_name___", shared_memory: true}); }, /Could not find shared memory region/, 'Does not accept wrong name');
113113
});
114114

115+
test('constructor: takes a default_radius argument', function(assert) {
116+
assert.plan(1);
117+
var osrm = new OSRM({algorithm: 'MLD', path: monaco_mld_path, default_radius: 1});
118+
assert.ok(osrm);
119+
});
120+
121+
test('constructor: throws if default_radius is not a number', function(assert) {
122+
assert.plan(2);
123+
assert.throws(function() { new OSRM({algorithm: 'MLD', path: monaco_mld_path, default_radius: 'abc'}); }, /default_radius must be an integral number/, 'Does not accept string');
124+
assert.ok(new OSRM({algorithm: 'MLD', path: monaco_mld_path, default_radius: 1}), 'Does accept number');
125+
});
126+
115127
test('constructor: parses custom limits', function(assert) {
116128
assert.plan(1);
117129
var osrm = new OSRM({

0 commit comments

Comments
 (0)