detect broken roundabout-taggings
This commit is contained in:
parent
7a523713c7
commit
d3a6b5a77e
@ -13,6 +13,7 @@
|
|||||||
- Invalid only_* restrictions could result in loss of connectivity. As a fallback, we assume all turns allowed when the restriction is not valid
|
- Invalid only_* restrictions could result in loss of connectivity. As a fallback, we assume all turns allowed when the restriction is not valid
|
||||||
- Fixed a bug that could result in an infinite loop when finding information about an upcoming intersection
|
- Fixed a bug that could result in an infinite loop when finding information about an upcoming intersection
|
||||||
- Fixed a bug that led to not discovering if a road simply looses a considered prefix
|
- Fixed a bug that led to not discovering if a road simply looses a considered prefix
|
||||||
|
- BREAKING: Fixed a bug that could crash postprocessing of instructions on invalid roundabout taggings. This change requires reprocessing datasets with osrm-extract and osrm-contract
|
||||||
|
|
||||||
# 5.3.0
|
# 5.3.0
|
||||||
Changes from 5.3.0-rc.3
|
Changes from 5.3.0-rc.3
|
||||||
|
@ -229,7 +229,7 @@ Feature: Basic Roundabout
|
|||||||
| a,e | ab,ce,ce | depart,roundabout-exit-1,arrive |
|
| a,e | ab,ce,ce | depart,roundabout-exit-1,arrive |
|
||||||
| a,f | ab,df,df | depart,roundabout-exit-2,arrive |
|
| a,f | ab,df,df | depart,roundabout-exit-2,arrive |
|
||||||
|
|
||||||
Scenario: Collinear in Y
|
Scenario: Collinear in Y
|
||||||
Given the node map
|
Given the node map
|
||||||
| | a |
|
| | a |
|
||||||
| | b |
|
| | b |
|
||||||
@ -325,3 +325,62 @@ Feature: Basic Roundabout
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns |
|
| waypoints | route | turns |
|
||||||
| a,k | massachusetts,massachusetts,massachusetts,massachusetts | depart,sheridan circle-exit-2,dupont circle-exit-1,arrive |
|
| a,k | massachusetts,massachusetts,massachusetts,massachusetts | depart,sheridan circle-exit-2,dupont circle-exit-1,arrive |
|
||||||
|
|
||||||
|
#2856 - http://www.openstreetmap.org/#map=19/47.23318/-1.56563
|
||||||
|
Scenario: Linked Roundabouts
|
||||||
|
Given the node map
|
||||||
|
| | | | | | | | | | | | | | x |
|
||||||
|
| | u | | | | | | | | | | | r | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | t | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | s | | | |
|
||||||
|
| | | v | | | i | | h | | g | | | | |
|
||||||
|
| | | | | | | | | | | | q | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | j | | | | | | | | f | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | a | | | | | | | | e | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | b | | c | | d | | p | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | m | | | | | | | | n | | | |
|
||||||
|
| | | | | l | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | k | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
| | w | | | | | | | | | | o | | |
|
||||||
|
|
||||||
|
And the ways
|
||||||
|
| nodes | junction | name | highway | oneway |
|
||||||
|
| abija | roundabout | egg | primary | yes |
|
||||||
|
| defgd | roundabout | egg | primary | yes |
|
||||||
|
| bcd | roundabout | egg | primary | yes |
|
||||||
|
| ghi | | egg | primary | yes |
|
||||||
|
| amklb | | ll | primary | yes |
|
||||||
|
| wk | | ll | primary | no |
|
||||||
|
| dnope | | lr | secondary | yes |
|
||||||
|
| fqrsg | | tr | primary | yes |
|
||||||
|
| rx | | tr | primary | no |
|
||||||
|
| ituvj | | tl | primary | yes |
|
||||||
|
|
||||||
|
And the nodes
|
||||||
|
| node | highway |
|
||||||
|
| c | give_way |
|
||||||
|
| h | give_way |
|
||||||
|
|
||||||
|
When I route I should get
|
||||||
|
| waypoints | route | turns |
|
||||||
|
# since we cannot handle these invalid roundabout tags yet, we cannout output roundabout taggings. This will hopefully change some day
|
||||||
|
#| w,x | ll,egg,egg,tr,tr | depart,roundabout-exit-1,roundabout-exit-2,arrive |
|
||||||
|
| w,x | ll,egg,egg,tr,tr | depart,turn right,continue left,turn slight left,arrive |
|
||||||
|
|
||||||
|
@ -270,6 +270,19 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
|
|||||||
std::set<NodeID> roundabout_nodes; // needs to be sorted
|
std::set<NodeID> roundabout_nodes; // needs to be sorted
|
||||||
|
|
||||||
// this value is a hard abort to deal with potential self-loops
|
// this value is a hard abort to deal with potential self-loops
|
||||||
|
const auto countRoundaboutFlags = [&](const NodeID at_node) {
|
||||||
|
// FIXME: this would be nicer as boost::count_if, but our integer range does not support
|
||||||
|
// these range based handlers
|
||||||
|
std::size_t count = 0;
|
||||||
|
for (const auto edge : node_based_graph.GetAdjacentEdgeRange(at_node))
|
||||||
|
{
|
||||||
|
const auto &edge_data = node_based_graph.GetEdgeData(edge);
|
||||||
|
if (edge_data.roundabout)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
};
|
||||||
|
|
||||||
NodeID last_node = nid;
|
NodeID last_node = nid;
|
||||||
while (0 == roundabout_nodes.count(last_node))
|
while (0 == roundabout_nodes.count(last_node))
|
||||||
{
|
{
|
||||||
@ -277,6 +290,10 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
|
|||||||
if (node_based_graph.GetOutDegree(last_node) > 2)
|
if (node_based_graph.GetOutDegree(last_node) > 2)
|
||||||
roundabout_nodes.insert(last_node);
|
roundabout_nodes.insert(last_node);
|
||||||
|
|
||||||
|
// detect invalid/complex roundabout taggings
|
||||||
|
if (countRoundaboutFlags(last_node) != 2)
|
||||||
|
return RoundaboutType::None;
|
||||||
|
|
||||||
const auto eid = getNextOnRoundabout(last_node);
|
const auto eid = getNextOnRoundabout(last_node);
|
||||||
|
|
||||||
if (eid == SPECIAL_EDGEID)
|
if (eid == SPECIAL_EDGEID)
|
||||||
|
Loading…
Reference in New Issue
Block a user