Skip to content

Commit 03fd020

Browse files
committed
Implement radius checking for bearings
1 parent 2391ab5 commit 03fd020

File tree

7 files changed

+33
-1
lines changed

7 files changed

+33
-1
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Unreleased
22
- Changes from 5.27.1
3+
- API:
4+
- CHANGED: Require a `radius` parameter when using `bearings`. [#6572](https://github.com/Project-OSRM/osrm-backend/pull/6572)
35
- Features
46
- ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
57
- Build:

docs/http.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ To pass parameters to each location some options support an array-like encoding:
3131

3232
| Option | Values | Description |
3333
|----------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
34-
|bearings |`{bearing};{bearing}[;{bearing} ...]` |Limits the search to segments with given bearing in degrees towards true north in a clockwise direction. |
34+
|bearings |`{bearing};{bearing}[;{bearing} ...]` |Limits the search to segments with given bearing in degrees towards true north in a clockwise direction. Requires a corresponding radius or set default_radius flag. |
3535
|radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. |
3636
|generate\_hints |`true` (default), `false` |Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. |
3737
|hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. |

include/nodejs/node_osrm_support.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,12 @@ inline bool argumentsToParameter(const Napi::CallbackInfo &args,
536536
return false;
537537
}
538538

539+
if (!obj.Has("radiuses") && default_radius.IsUndefined())
540+
{
541+
ThrowError(args.Env(), "Bearings must be accompanied with radiuses or a default_radius must be set.");
542+
return false;
543+
}
544+
539545
auto bearings_array = bearings.As<Napi::Array>();
540546

541547
if (bearings_array.Length() != params->coordinates.size())

src/engine/plugins/match.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ Status MatchPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
131131
return Error("InvalidValue", "Invalid coordinate value.", result);
132132
}
133133

134+
if(!parameters.bearings.empty() && !default_radius.has_value() && parameters.radiuses.size() != parameters.bearings.size())
135+
{
136+
return Error(
137+
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
138+
}
139+
134140
if (max_radius_map_matching > 0 && std::any_of(parameters.radiuses.begin(),
135141
parameters.radiuses.end(),
136142
[&](const auto &radius) {

src/engine/plugins/nearest.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ Status NearestPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms
4343
return Error("InvalidOptions", "Only one input coordinate is supported", result);
4444
}
4545

46+
if(!params.bearings.empty() && !default_radius.has_value() && params.radiuses.size() != params.bearings.size())
47+
{
48+
return Error(
49+
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
50+
}
51+
4652
auto phantom_nodes = GetPhantomNodes(facade, params, params.number_of_results);
4753

4854
if (phantom_nodes.front().size() == 0)

src/engine/plugins/table.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
4444
"InvalidOptions", "Number of bearings does not match number of coordinates", result);
4545
}
4646

47+
if(!params.bearings.empty() && !default_radius.has_value() && params.radiuses.size() != params.bearings.size())
48+
{
49+
return Error(
50+
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
51+
}
52+
4753
// Empty sources or destinations means the user wants all of them included, respectively
4854
// The ManyToMany routing algorithm we dispatch to below already handles this perfectly.
4955
const auto num_sources =

src/engine/plugins/viaroute.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ Status ViaRoutePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithm
8282
if (!CheckAlgorithms(route_parameters, algorithms, result))
8383
return Status::Error;
8484

85+
if(!route_parameters.bearings.empty() && !default_radius.has_value() && route_parameters.radiuses.size() != route_parameters.bearings.size())
86+
{
87+
return Error(
88+
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
89+
}
90+
8591
const auto &facade = algorithms.GetFacade();
8692
auto phantom_node_pairs = GetPhantomNodes(facade, route_parameters);
8793
if (phantom_node_pairs.size() != route_parameters.coordinates.size())

0 commit comments

Comments
 (0)