Use global uturns parameter.
Instead of previously per-via settings like uturns=true;false;true;; it now only supports a global setting uturns=true.
This commit is contained in:
parent
253496c7ee
commit
e10e8910f3
@ -60,10 +60,10 @@ struct RouteParameters : public BaseParameters
|
||||
const bool alternatives_,
|
||||
const GeometriesType geometries_,
|
||||
const OverviewType overview_,
|
||||
std::vector<boost::optional<bool>> uturns_,
|
||||
boost::optional<bool> uturns_,
|
||||
Args... args_)
|
||||
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
||||
geometries{geometries_}, overview{overview_}, uturns{std::move(uturns_)}
|
||||
geometries{geometries_}, overview{overview_}, uturns{uturns_}
|
||||
{
|
||||
}
|
||||
|
||||
@ -71,12 +71,11 @@ struct RouteParameters : public BaseParameters
|
||||
bool alternatives = true;
|
||||
GeometriesType geometries = GeometriesType::Polyline;
|
||||
OverviewType overview = OverviewType::Simplified;
|
||||
std::vector<boost::optional<bool>> uturns;
|
||||
boost::optional<bool> uturns;
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return coordinates.size() >= 2 && BaseParameters::IsValid() &&
|
||||
(uturns.empty() || uturns.size() == coordinates.size());
|
||||
return coordinates.size() >= 2 && BaseParameters::IsValid();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -240,11 +240,9 @@ class ShortestPathRouting final
|
||||
static const constexpr bool UTURN_DEFAULT = false;
|
||||
|
||||
void operator()(const std::vector<PhantomNodes> &phantom_nodes_vector,
|
||||
const std::vector<boost::optional<bool>> &uturn_indicators,
|
||||
const boost::optional<bool> uturns,
|
||||
InternalRouteResult &raw_route_data) const
|
||||
{
|
||||
BOOST_ASSERT(uturn_indicators.empty() ||
|
||||
uturn_indicators.size() == phantom_nodes_vector.size() + 1);
|
||||
engine_working_data.InitializeOrClearFirstThreadLocalStorage(
|
||||
super::facade->GetNumberOfNodes());
|
||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(
|
||||
@ -270,7 +268,7 @@ class ShortestPathRouting final
|
||||
std::vector<NodeID> total_packed_path_to_reverse;
|
||||
std::vector<std::size_t> packed_leg_to_reverse_begin;
|
||||
|
||||
const bool use_uturn_indicators = !uturn_indicators.empty();
|
||||
const bool allow_u_turn_at_via = uturns ? *uturns : UTURN_DEFAULT;
|
||||
|
||||
std::size_t current_leg = 0;
|
||||
// this implements a dynamic program that finds the shortest route through
|
||||
@ -286,12 +284,6 @@ class ShortestPathRouting final
|
||||
const auto &source_phantom = phantom_node_pair.source_phantom;
|
||||
const auto &target_phantom = phantom_node_pair.target_phantom;
|
||||
|
||||
const bool use_uturn_default =
|
||||
!use_uturn_indicators || !uturn_indicators[current_leg + 1];
|
||||
const bool allow_u_turn_at_via =
|
||||
(use_uturn_default && UTURN_DEFAULT) ||
|
||||
(!use_uturn_default && *uturn_indicators[current_leg + 1]);
|
||||
|
||||
bool search_to_forward_node = target_phantom.forward_node_id != SPECIAL_NODEID;
|
||||
bool search_to_reverse_node = target_phantom.reverse_node_id != SPECIAL_NODEID;
|
||||
|
||||
|
@ -27,7 +27,7 @@ struct RouteParametersGrammar : public BaseParametersGrammar
|
||||
using AlternativeT = bool;
|
||||
using GeometriesT = engine::api::RouteParameters::GeometriesType;
|
||||
using OverviewT = engine::api::RouteParameters::OverviewType;
|
||||
using UturnsT = std::vector<boost::optional<bool>>;
|
||||
using UturnsT = bool;
|
||||
|
||||
RouteParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
|
||||
{
|
||||
@ -72,9 +72,9 @@ struct RouteParametersGrammar : public BaseParametersGrammar
|
||||
overview_rule = qi::lit("overview=simplified")[set_simplified_type] |
|
||||
qi::lit("overview=full")[set_full_type] |
|
||||
qi::lit("overview=false")[set_false_type];
|
||||
uturns_rule = qi::lit("uturns=") >> -qi::bool_ % ";";
|
||||
uturns_rule = qi::lit("uturns=default") | (qi::lit("uturns=") >> qi::bool_)[set_uturns];
|
||||
route_rule = steps_rule[set_steps] | alternatives_rule[set_alternatives] | geometries_rule |
|
||||
overview_rule | uturns_rule[set_uturns];
|
||||
overview_rule | uturns_rule;
|
||||
|
||||
root_rule =
|
||||
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (route_rule | base_rule) % '&');
|
||||
|
@ -135,19 +135,7 @@ InternalRouteResult TripPlugin::ComputeRoute(const std::vector<PhantomNode> &sna
|
||||
}
|
||||
BOOST_ASSERT(min_route.segment_end_coordinates.size() == trip.size());
|
||||
|
||||
std::vector<boost::optional<bool>> uturns;
|
||||
if (parameters.uturns.size() > 0)
|
||||
{
|
||||
uturns.resize(trip.size() + 1);
|
||||
std::transform(trip.begin(), trip.end(), uturns.begin(), [¶meters](const NodeID idx)
|
||||
{
|
||||
return parameters.uturns[idx];
|
||||
});
|
||||
BOOST_ASSERT(uturns.size() > 0);
|
||||
uturns.back() = parameters.uturns[trip.front()];
|
||||
}
|
||||
|
||||
shortest_path(min_route.segment_end_coordinates, uturns, min_route);
|
||||
shortest_path(min_route.segment_end_coordinates, parameters.uturns, min_route);
|
||||
|
||||
BOOST_ASSERT_MSG(min_route.shortest_path_length < INVALID_EDGE_WEIGHT, "unroutable route");
|
||||
return min_route;
|
||||
|
@ -25,9 +25,7 @@ std::string getWrongOptionHelp(const engine::api::RouteParameters ¶meters)
|
||||
constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "bearings",
|
||||
parameters.bearings, coord_size, help) ||
|
||||
constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "radiuses",
|
||||
parameters.radiuses, coord_size, help) ||
|
||||
constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "uturns",
|
||||
parameters.uturns, coord_size, help);
|
||||
parameters.radiuses, coord_size, help);
|
||||
|
||||
if (!param_size_mismatch && parameters.coordinates.size() < 2)
|
||||
{
|
||||
|
@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
BOOST_CHECK_EQUAL(reference_1.alternatives, result_1->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_1.geometries, result_1->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_1.overview, result_1->overview);
|
||||
CHECK_EQUAL_RANGE(reference_1.uturns, result_1->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_1.uturns, result_1->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
|
||||
@ -146,25 +146,24 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
BOOST_CHECK_EQUAL(reference_2.alternatives, result_2->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_2.geometries, result_2->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_2.overview, result_2->overview);
|
||||
CHECK_EQUAL_RANGE(reference_2.uturns, result_2->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_2.uturns, result_2->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_2.bearings, result_2->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
|
||||
|
||||
std::vector<boost::optional<bool>> uturns_3 = {true, false, boost::none};
|
||||
engine::api::RouteParameters reference_3{
|
||||
false, false, engine::api::RouteParameters::GeometriesType::GeoJSON,
|
||||
engine::api::RouteParameters::OverviewType::False, uturns_3};
|
||||
engine::api::RouteParameters::OverviewType::False, true};
|
||||
reference_3.coordinates = coords_1;
|
||||
auto result_3 = api::parseParameters<engine::api::RouteParameters>(
|
||||
"1,2;3,4?steps=false&alternatives=false&geometries=geojson&overview=false&uturns=true;"
|
||||
"1,2;3,4?steps=false&alternatives=false&geometries=geojson&overview=false&uturns=true"
|
||||
"false;");
|
||||
BOOST_CHECK(result_3);
|
||||
BOOST_CHECK_EQUAL(reference_3.steps, result_3->steps);
|
||||
BOOST_CHECK_EQUAL(reference_3.alternatives, result_3->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_3.geometries, result_3->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_3.overview, result_3->overview);
|
||||
CHECK_EQUAL_RANGE(reference_3.uturns, result_3->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_3.uturns, result_3->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_3.bearings, result_3->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_3.radiuses, result_3->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates);
|
||||
@ -180,7 +179,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
true,
|
||||
engine::api::RouteParameters::GeometriesType::Polyline,
|
||||
engine::api::RouteParameters::OverviewType::Simplified,
|
||||
std::vector<boost::optional<bool>>{},
|
||||
boost::optional<bool>{},
|
||||
coords_1,
|
||||
hints_4,
|
||||
std::vector<boost::optional<double>>{},
|
||||
@ -196,7 +195,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
BOOST_CHECK_EQUAL(reference_4.alternatives, result_4->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_4.geometries, result_4->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_4.overview, result_4->overview);
|
||||
CHECK_EQUAL_RANGE(reference_4.uturns, result_4->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_4.uturns, result_4->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_4.bearings, result_4->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_4.radiuses, result_4->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_4.coordinates, result_4->coordinates);
|
||||
@ -208,7 +207,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
true,
|
||||
engine::api::RouteParameters::GeometriesType::Polyline,
|
||||
engine::api::RouteParameters::OverviewType::Simplified,
|
||||
std::vector<boost::optional<bool>>{},
|
||||
boost::optional<bool>{},
|
||||
coords_1,
|
||||
std::vector<boost::optional<engine::Hint>>{},
|
||||
std::vector<boost::optional<double>>{},
|
||||
@ -220,7 +219,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
BOOST_CHECK_EQUAL(reference_5.alternatives, result_5->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_5.geometries, result_5->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_5.overview, result_5->overview);
|
||||
CHECK_EQUAL_RANGE(reference_5.uturns, result_5->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_5.uturns, result_5->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_5.bearings, result_5->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_5.radiuses, result_5->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_5.coordinates, result_5->coordinates);
|
||||
@ -238,7 +237,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
|
||||
BOOST_CHECK_EQUAL(reference_6.alternatives, result_6->alternatives);
|
||||
BOOST_CHECK_EQUAL(reference_6.geometries, result_6->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_6.overview, result_6->overview);
|
||||
CHECK_EQUAL_RANGE(reference_6.uturns, result_6->uturns);
|
||||
BOOST_CHECK_EQUAL(reference_6.uturns, result_6->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_6.bearings, result_6->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_6.radiuses, result_6->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_6.coordinates, result_6->coordinates);
|
||||
|
Loading…
Reference in New Issue
Block a user