Skip to content

Require a radius parameter when using bearings #6572

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -2,6 +2,8 @@

# 6.0.0 RC1
- Changes from 5.27.1
- API:
- CHANGED: Require a `radius` parameter when using `bearings`. [#6572](https://github.com/Project-OSRM/osrm-backend/pull/6572)
- Features
- ADDED: Add generic support for obstacles [#7130](https://github.com/Project-OSRM/osrm-backend/pull/7130)
- ADDED: Route pedestrians over highway=platform [#6993](https://github.com/Project-OSRM/osrm-backend/pull/6993)
2 changes: 1 addition & 1 deletion docs/http.md
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@ To pass parameters to each location some options support an array-like encoding:

| Option | Values | Description |
|----------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|bearings |`{bearing};{bearing}[;{bearing} ...]` |Limits the search to segments with given bearing in degrees towards true north in a clockwise direction. |
|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. |
|radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. |
|generate\_hints |`true` (default), `false` |Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. |
|hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. |
8 changes: 8 additions & 0 deletions include/nodejs/node_osrm_support.hpp
Original file line number Diff line number Diff line change
@@ -590,6 +590,14 @@ inline bool argumentsToParameter(const Napi::CallbackInfo &args,
return false;
}

if (!obj.Has("radiuses") && default_radius.IsUndefined())
{
ThrowError(
args.Env(),
"Bearings must be accompanied with radiuses or a default_radius must be set.");
return false;
}

auto bearings_array = bearings.As<Napi::Array>();

if (bearings_array.Length() != params->coordinates.size())
7 changes: 7 additions & 0 deletions src/engine/plugins/match.cpp
Original file line number Diff line number Diff line change
@@ -130,6 +130,13 @@ Status MatchPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
return Error("InvalidValue", "Invalid coordinate value.", result);
}

if (!parameters.bearings.empty() && !default_radius.has_value() &&
parameters.radiuses.size() != parameters.bearings.size())
{
return Error(
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
}

if (max_radius_map_matching > 0 && std::any_of(parameters.radiuses.begin(),
parameters.radiuses.end(),
[&](const auto &radius)
7 changes: 7 additions & 0 deletions src/engine/plugins/nearest.cpp
Original file line number Diff line number Diff line change
@@ -43,6 +43,13 @@ Status NearestPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms
return Error("InvalidOptions", "Only one input coordinate is supported", result);
}

if (!params.bearings.empty() && !default_radius.has_value() &&
params.radiuses.size() != params.bearings.size())
{
return Error(
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
}

auto phantom_nodes = GetPhantomNodes(facade, params, params.number_of_results);

if (phantom_nodes.front().size() == 0)
7 changes: 7 additions & 0 deletions src/engine/plugins/table.cpp
Original file line number Diff line number Diff line change
@@ -44,6 +44,13 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
"InvalidOptions", "Number of bearings does not match number of coordinates", result);
}

if (!params.bearings.empty() && !default_radius.has_value() &&
params.radiuses.size() != params.bearings.size())
{
return Error(
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
}

// Empty sources or destinations means the user wants all of them included, respectively
// The ManyToMany routing algorithm we dispatch to below already handles this perfectly.
const auto num_sources =
7 changes: 7 additions & 0 deletions src/engine/plugins/viaroute.cpp
Original file line number Diff line number Diff line change
@@ -82,6 +82,13 @@ Status ViaRoutePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithm
if (!CheckAlgorithms(route_parameters, algorithms, result))
return Status::Error;

if (!route_parameters.bearings.empty() && !default_radius.has_value() &&
route_parameters.radiuses.size() != route_parameters.bearings.size())
{
return Error(
"InvalidOptions", "Number of radiuses does not match number of bearings", result);
}

const auto &facade = algorithms.GetFacade();
auto phantom_node_pairs = GetPhantomNodes(facade, route_parameters);
if (phantom_node_pairs.size() != route_parameters.coordinates.size())
Loading
Oops, something went wrong.