Clarify API and ensure bearings returned to users are in the range 0-359

This commit is contained in:
Daniel Patterson 2016-12-07 14:03:09 -08:00 committed by Patrick Niklaus
parent 84b618ed1a
commit 1b51163b1d
4 changed files with 32 additions and 8 deletions

View File

@ -1,3 +1,8 @@
# 5.5.1
- Changes from 5.5.0
- Bugfixes
- Fix #3418 and ensure we only return bearings in the range 0-359 in API responses
# 5.5.0
- Changes from 5.4.0
- API:

View File

@ -577,9 +577,9 @@ step.
- `location`: A `[longitude, latitude]` pair describing the location of the turn.
- `bearing_before`: The clockwise angle from true north to the
direction of travel immediately before the maneuver.
direction of travel immediately before the maneuver. Range 0-359.
- `bearing_after`: The clockwise angle from true north to the
direction of travel immediately after the maneuver.
direction of travel immediately after the maneuver. Range 0-359.
- `type` A string indicating the type of maneuver. **new identifiers might be introduced without API change**
Types unknown to the client should be handled like the `turn` type, the existance of correct `modifier` values is guranteed.
@ -676,7 +676,7 @@ location of the StepManeuver. Further intersections are listed for every cross-w
**Properties**
- `location`: A `[longitude, latitude]` pair describing the location of the turn.
- `bearings`: A list of bearing values (e.g. [0,90,180,270]) that are available at the intersection. The bearings describe all available roads at the intersection.
- `bearings`: A list of bearing values (e.g. [0,90,180,270]) that are available at the intersection. The bearings describe all available roads at the intersection. Values are between 0-359 (0=true north)
- `entry`: A list of entry flags, corresponding in a 1:1 relationship to the bearings. A value of `true` indicates that the respective road could be entered on a valid route.
`false` indicates that the turn onto the respective road would violate a restriction.
- `in`: index into bearings/entry array. Used to calculate the bearing just before the turn. Namely, the clockwise angle from true north to the

View File

@ -50,3 +50,20 @@ Feature: Features related to bugs
And the data has been saved to disk
When I try to run "osrm-extract {osm_file} --profile {profile_file}"
Then it should exit successfully
@3418
Scenario: Bearings should be between 0-359
Given the node locations
| node | lon | lat |
| a | -122.0232176 | 37.3282203 |
| b | -122.0232199 | 37.3302422 |
| c | -122.0232252 | 37.3312787 |
And the ways
| nodes | name | highway |
| ab | Pear to Merrit | residential |
| bc | Merritt to Apricot | residential |
When I route I should get
| waypoints | route | intersections |
| a,c | Pear to Merrit,Merritt to Apricot,Merritt to Apricot | true:0;true:0 false:180;true:180 |

View File

@ -192,8 +192,8 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver)
detail::instructionModifierToString(maneuver.instruction.direction_modifier);
step_maneuver.values["location"] = detail::coordinateToLonLat(maneuver.location);
step_maneuver.values["bearing_before"] = std::round(maneuver.bearing_before);
step_maneuver.values["bearing_after"] = std::round(maneuver.bearing_after);
step_maneuver.values["bearing_before"] = std::fmod(std::round(maneuver.bearing_before), 360);
step_maneuver.values["bearing_after"] = std::fmod(std::round(maneuver.bearing_after), 360);
if (maneuver.exit != 0)
step_maneuver.values["exit"] = maneuver.exit;
@ -207,9 +207,11 @@ util::json::Object makeIntersection(const guidance::Intersection &intersection)
util::json::Array entry;
bearings.values.reserve(intersection.bearings.size());
std::copy(intersection.bearings.begin(),
intersection.bearings.end(),
std::back_inserter(bearings.values));
std::transform(
intersection.bearings.begin(),
intersection.bearings.end(),
std::back_inserter(bearings.values),
[](const double bearing) -> util::json::Value { return std::fmod(bearing, 360); });
entry.values.reserve(intersection.entry.size());
std::transform(intersection.entry.begin(),