Handle motorway forks with links as a normal motorway ...

passing some ramps or mering onto another motorway
This commit is contained in:
Michael Krasnyk 2018-02-16 11:50:08 +01:00
parent 49811e1f46
commit de13834c12
3 changed files with 13 additions and 16 deletions

View File

@ -6,6 +6,7 @@
- CHANGED #4835: MAXIMAL_ALLOWED_SEPARATION_WIDTH increased to 12 meters - CHANGED #4835: MAXIMAL_ALLOWED_SEPARATION_WIDTH increased to 12 meters
- CHANGED #4842: Lower priority links from a motorway now are used as motorway links [#4842](https://github.com/Project-OSRM/osrm-backend/pull/4842) - CHANGED #4842: Lower priority links from a motorway now are used as motorway links [#4842](https://github.com/Project-OSRM/osrm-backend/pull/4842)
- CHANGED #4895: Use ramp bifurcations as fork intersections [#4895](https://github.com/Project-OSRM/osrm-backend/issues/4895) - CHANGED #4895: Use ramp bifurcations as fork intersections [#4895](https://github.com/Project-OSRM/osrm-backend/issues/4895)
- CHANGED #4893: Handle motorway forks with links as normal motorway intersections[#4893](https://github.com/Project-OSRM/osrm-backend/issues/4893)
- Profile: - Profile:
- FIXED: `highway=service` will now be used for restricted access, `access=private` is still disabled for snapping. - FIXED: `highway=service` will now be used for restricted access, `access=private` is still disabled for snapping.
- ADDED #4775: Exposes more information to the turn function, now being able to set turn weights with highway and access information of the turn as well as other roads at the intersection [#4775](https://github.com/Project-OSRM/osrm-backend/issues/4775) - ADDED #4775: Exposes more information to the turn function, now being able to set turn weights with highway and access information of the turn as well as other roads at the intersection [#4775](https://github.com/Project-OSRM/osrm-backend/issues/4775)

View File

@ -342,6 +342,6 @@ Feature: Motorway Guidance
When I route I should get When I route I should get
| waypoints | route | turns | | waypoints | route | turns |
| a,d | abce,cd,cd | depart,turn straight,arrive | | a,d | abce,cd,cd | depart,off ramp slight left,arrive |
| a,e | abce,abce,abce | depart,fork slight left,arrive | | a,e | abce,abce | depart,arrive |
| a,f | abce,cf,cf | depart,fork slight right,arrive | | a,f | abce,cf,cf | depart,turn slight right,arrive |

View File

@ -118,16 +118,6 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(via_eid).annotation_data); node_data_container.GetAnnotation(node_based_graph.GetEdgeData(via_eid).annotation_data);
BOOST_ASSERT(isMotorwayClass(via_eid, node_based_graph)); BOOST_ASSERT(isMotorwayClass(via_eid, node_based_graph));
const auto countExitingMotorways = [this](const Intersection &intersection) {
unsigned count = 0;
for (const auto &road : intersection)
{
if (road.entry_allowed && isMotorwayClass(road.eid, node_based_graph))
++count;
}
return count;
};
// find the angle that continues on our current highway // find the angle that continues on our current highway
const auto getContinueAngle = [this, in_data](const Intersection &intersection) { const auto getContinueAngle = [this, in_data](const Intersection &intersection) {
for (const auto &road : intersection) for (const auto &road : intersection)
@ -219,7 +209,13 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
} }
else else
{ {
const unsigned exiting_motorways = countExitingMotorways(intersection); const auto valid_exits = std::count_if(intersection.begin(),
intersection.end(),
[](const auto &road) { return road.entry_allowed; });
const auto exiting_motorways =
std::count_if(intersection.begin(), intersection.end(), [this](const auto &road) {
return road.entry_allowed && isMotorwayClass(road.eid, node_based_graph);
});
if (exiting_motorways == 0) if (exiting_motorways == 0)
{ {
@ -233,7 +229,7 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
} }
} }
} }
else if (exiting_motorways == 1) else if (exiting_motorways == 1 || exiting_motorways != valid_exits)
{ {
// normal motorway passing some ramps or mering onto another motorway // normal motorway passing some ramps or mering onto another motorway
if (intersection.size() == 2) if (intersection.size() == 2)