fix collapsing into uturns, that aren't u-turns

This commit is contained in:
Moritz Kobitzsch 2017-10-13 17:06:22 +02:00 committed by Patrick Niklaus
parent 8719821363
commit 37774a331a
3 changed files with 30 additions and 3 deletions

View File

@ -174,5 +174,5 @@ Feature: Collapse
| fe | service | |
When I route I should get
| waypoints | route | turns |
| c,e | road,, | depart,turn uturn,arrive |
| waypoints | route | turns |
| c,e | road,,, | depart,turn right,turn right,arrive |

View File

@ -4,6 +4,7 @@
#include "extractor/guidance/turn_instruction.hpp"
#include "engine/guidance/route_step.hpp"
#include "util/attributes.hpp"
#include "util/bearing.hpp"
#include "util/guidance/name_announcements.hpp"
#include <boost/range/algorithm_ext/erase.hpp>
@ -189,6 +190,27 @@ inline std::vector<RouteStep> removeNoTurnInstructions(std::vector<RouteStep> st
return steps;
}
inline double totalTurnAngle(const RouteStep &entry_step, const RouteStep &exit_step)
{
if (entry_step.geometry_begin > exit_step.geometry_begin)
return totalTurnAngle(exit_step, entry_step);
const auto exit_intersection = exit_step.intersections.front();
const auto entry_intersection = entry_step.intersections.front();
if ((exit_intersection.out >= exit_intersection.bearings.size()) ||
(entry_intersection.in >= entry_intersection.bearings.size()))
return entry_intersection.bearings[entry_intersection.out];
const auto exit_step_exit_bearing = exit_intersection.bearings[exit_intersection.out];
const auto entry_step_entry_bearing =
util::bearing::reverse(entry_intersection.bearings[entry_intersection.in]);
const double total_angle =
util::bearing::angleBetween(entry_step_entry_bearing, exit_step_exit_bearing);
return total_angle;
}
} /* namespace guidance */
} /* namespace engine */
} /* namespace osrm */

View File

@ -306,7 +306,12 @@ bool suppressedStraightBetweenTurns(const RouteStepIterator step_entering_inters
hasTurnType(*step_leaving_intersection, TurnType::Continue) ||
hasTurnType(*step_leaving_intersection, TurnType::OnRamp));
return both_short_enough && similar_length && correct_types;
const auto total_angle =
totalTurnAngle(*step_entering_intersection, *step_leaving_intersection);
const auto total_angle_is_not_uturn =
(total_angle > NARROW_TURN_ANGLE) && (total_angle < 360 - NARROW_TURN_ANGLE);
return both_short_enough && similar_length && correct_types && total_angle_is_not_uturn;
}
bool maneuverSucceededByNameChange(const RouteStepIterator step_entering_intersection,