adds distinction between rotaries/rounabouts
This commit is contained in:
committed by
Patrick Niklaus
parent
278ec04f5e
commit
f2443c64db
@@ -1,16 +1,16 @@
|
||||
#include "engine/api/json_factory.hpp"
|
||||
|
||||
#include "engine/polyline_compressor.hpp"
|
||||
#include "engine/hint.hpp"
|
||||
#include "engine/polyline_compressor.hpp"
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/range/irange.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/range/irange.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
using TurnType = osrm::extractor::guidance::TurnType;
|
||||
@@ -28,23 +28,17 @@ namespace json
|
||||
namespace detail
|
||||
{
|
||||
|
||||
const constexpr char *modifier_names[] = {"uturn",
|
||||
"sharp right",
|
||||
"right",
|
||||
"slight right",
|
||||
"straight",
|
||||
"slight left",
|
||||
"left",
|
||||
"sharp left"};
|
||||
const constexpr char *modifier_names[] = {"uturn", "sharp right", "right", "slight right",
|
||||
"straight", "slight left", "left", "sharp left"};
|
||||
|
||||
// translations of TurnTypes. Not all types are exposed to the outside world.
|
||||
// invalid types should never be returned as part of the API
|
||||
const constexpr char *turn_type_names[] = {
|
||||
"invalid", "no turn", "invalid", "new name", "continue", "turn",
|
||||
"turn", "turn", "turn", "turn", "merge", "ramp",
|
||||
"ramp", "ramp", "ramp", "ramp", "fork", "end of road",
|
||||
"roundabout", "invalid", "roundabout", "invalid", "traffic circle", "invalid",
|
||||
"traffic circle", "invalid", "invalid", "restriction", "notification"};
|
||||
"invalid", "no turn", "invalid", "new name", "continue", "turn",
|
||||
"turn", "turn", "turn", "turn", "merge", "ramp",
|
||||
"ramp", "ramp", "ramp", "ramp", "fork", "end of road",
|
||||
"roundabout", "invalid", "roundabout", "invalid", "rotary", "invalid",
|
||||
"rotary", "invalid", "invalid", "restriction", "notification"};
|
||||
const constexpr char *waypoint_type_names[] = {"invalid", "arrive", "depart"};
|
||||
|
||||
// Check whether to include a modifier in the result of the API
|
||||
@@ -144,6 +138,7 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver)
|
||||
if (detail::isValidModifier(maneuver))
|
||||
step_maneuver.values["modifier"] =
|
||||
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);
|
||||
@@ -164,6 +159,9 @@ util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geo
|
||||
route_step.values["distance"] = std::round(step.distance * 10) / 10.;
|
||||
route_step.values["duration"] = std::round(step.duration * 10) / 10.;
|
||||
route_step.values["name"] = std::move(step.name);
|
||||
if (!step.rotary_name.empty())
|
||||
route_step.values["rotary_name"] = std::move(step.rotary_name);
|
||||
|
||||
route_step.values["mode"] = detail::modeToString(std::move(step.mode));
|
||||
route_step.values["maneuver"] = makeStepManeuver(std::move(step.maneuver));
|
||||
route_step.values["geometry"] = std::move(geometry);
|
||||
@@ -215,8 +213,7 @@ util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> legs,
|
||||
json_steps.values.reserve(leg.steps.size());
|
||||
std::transform(
|
||||
std::make_move_iterator(leg.steps.begin()), std::make_move_iterator(leg.steps.end()),
|
||||
std::back_inserter(json_steps.values), [&step_geometry_iter](guidance::RouteStep step)
|
||||
{
|
||||
std::back_inserter(json_steps.values), [&step_geometry_iter](guidance::RouteStep step) {
|
||||
return makeRouteStep(std::move(step), std::move(*step_geometry_iter++));
|
||||
});
|
||||
json_legs.values.push_back(makeRouteLeg(std::move(leg), std::move(json_steps)));
|
||||
|
||||
@@ -54,6 +54,11 @@ void fixFinalRoundabout(std::vector<RouteStep> &steps)
|
||||
{
|
||||
propagation_step.maneuver.exit = 0;
|
||||
propagation_step.geometry_end = steps.back().geometry_begin;
|
||||
|
||||
if( propagation_step.maneuver.instruction.type == TurnType::EnterRotary ||
|
||||
propagation_step.maneuver.instruction.type == TurnType::EnterRotaryAtExit )
|
||||
propagation_step.rotary_name = propagation_step.name;
|
||||
|
||||
break;
|
||||
}
|
||||
else if (propagation_step.maneuver.instruction.type == TurnType::StayOnRoundabout)
|
||||
@@ -80,18 +85,20 @@ bool setUpRoundabout(RouteStep &step)
|
||||
step.maneuver.exit = 1;
|
||||
// prevent futher special case handling of these two.
|
||||
if (instruction.type == TurnType::EnterRotaryAtExit)
|
||||
step.maneuver.instruction = TurnType::EnterRotary;
|
||||
step.maneuver.instruction.type = TurnType::EnterRotary;
|
||||
else
|
||||
step.maneuver.instruction = TurnType::EnterRoundabout;
|
||||
step.maneuver.instruction.type = TurnType::EnterRoundabout;
|
||||
}
|
||||
|
||||
if (leavesRoundabout(instruction))
|
||||
{
|
||||
step.maneuver.exit = 1; // count the otherwise missing exit
|
||||
if (instruction.type == TurnType::EnterRotaryAtExit)
|
||||
step.maneuver.instruction = TurnType::EnterRotary;
|
||||
|
||||
// prevent futher special case handling of these two.
|
||||
if (instruction.type == TurnType::EnterAndExitRotary)
|
||||
step.maneuver.instruction.type = TurnType::EnterRotary;
|
||||
else
|
||||
step.maneuver.instruction = TurnType::EnterRoundabout;
|
||||
step.maneuver.instruction.type = TurnType::EnterRoundabout;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
@@ -123,6 +130,8 @@ void closeOffRoundabout(const bool on_roundabout,
|
||||
steps[1].maneuver.instruction.type = step.maneuver.instruction.type == TurnType::ExitRotary
|
||||
? TurnType::EnterRotary
|
||||
: TurnType::EnterRoundabout;
|
||||
if( steps[1].maneuver.instruction.type == TurnType::EnterRotary )
|
||||
steps[1].rotary_name = steps[0].name;
|
||||
}
|
||||
|
||||
// Normal exit from the roundabout, or exit from a previously fixed roundabout.
|
||||
@@ -144,6 +153,11 @@ void closeOffRoundabout(const bool on_roundabout,
|
||||
|
||||
propagation_step.maneuver.exit = step.maneuver.exit;
|
||||
propagation_step.geometry_end = step.geometry_end;
|
||||
// remember rotary name
|
||||
if( propagation_step.maneuver.instruction.type == TurnType::EnterRotary ||
|
||||
propagation_step.maneuver.instruction.type == TurnType::EnterRotaryAtExit )
|
||||
propagation_step.rotary_name = propagation_step.name;
|
||||
|
||||
propagation_step.name = step.name;
|
||||
propagation_step.name_id = step.name_id;
|
||||
break;
|
||||
@@ -482,7 +496,7 @@ LegGeometry resyncGeometry(LegGeometry leg_geometry, const std::vector<RouteStep
|
||||
leg_geometry.segment_offsets.push_back(step.geometry_end - 1);
|
||||
}
|
||||
|
||||
// remove the data fromt the reached-target step again
|
||||
// remove the data from the reached-target step again
|
||||
leg_geometry.segment_offsets.pop_back();
|
||||
leg_geometry.segment_distances.pop_back();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user