osrm-backend/features/car/multi_via_restrictions.feature
Michael Bell bfb74c2dad
Fix snapping target locations to ways used in turn restrictions (#6339)
Currently there is an edge-case in the turn restriction implementation,
such that routes can not be found if the target input location snaps
to a way used in a (multi) via restriction.

With the addition of snapping input locations to multiple ways, we
can now also snap to the "duplicate" edges created for the restriction graph,
thereby fixing the problem.
This is achieved by adding the duplicate restriction edges to the
geospatial search RTree.

This does open up the possibility of multiple paths representing exactly
the same route - one using the original edge as a source, the other
using the duplicate restriction graph edge as source. This is fine,
as both edges are represented by the same geometry, so will generate
the same result.
2022-08-27 15:59:44 +01:00

1092 lines
42 KiB
Gherkin

@routing @car @restrictions
Feature: Car - Multiple Via Turn restrictions
Background: Use car routing
Given the profile "car"
Given a grid size of 200 meters
@restriction-way @no_turning @overlap
Scenario: Car - Node restriction inside multiple via restriction
Given the node map
"""
1 2 3 4 5
a---b---c---d---e---------f---------g
| | |
|7 |8 |9
| | |
x---h---------i---------j
"""
And the ways
| nodes | oneway | name |
| ab | yes | forward |
| bc | yes | forward |
| cd | yes | forward |
| de | yes | forward |
| ef | yes | forward |
| fg | yes | forward |
| eh | yes | first |
| fi | yes | second |
| gj | yes | third |
| ih | yes | back |
| ji | yes | back |
| hx | yes | back |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc,cd,de,ef | fi | no_right_turn |
And the relations
| type | way:from | node:via | way:to | restriction |
| restriction | de | e | eh | no_right_turn |
When I route I should get
| from | to | route |
| 1 | x | forward,third,back,back |
| 2 | x | forward,second,back,back |
| 3 | x | forward,second,back,back |
| 4 | x | forward,second,back,back |
| 5 | x | forward,third,back,back |
| 7 | x | first,back,back |
| 8 | x | second,back,back |
| 9 | x | third,back,back |
@restriction-way @no_turning @overlap @conditionals
Scenario: Car - Conditional node restriction inside conditional multiple via restriction
Given the origin -9.2972,10.3811
# coordinate in Guinée, a country that observes GMT year round
Given the extract extra arguments "--parse-conditional-restrictions"
# time stamp for 10am on Tues, 02 May 2017 GMT
Given the contract extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the customize extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the node map
"""
1 2 3 4 5
a---b---c---d---e---------f---------g
| | |
|7 |8 |9
| | |
x---h---------i---------j
"""
And the ways
| nodes | oneway | name |
| ab | yes | forward |
| bc | yes | forward |
| cd | yes | forward |
| de | yes | forward |
| ef | yes | forward |
| fg | yes | forward |
| eh | yes | first |
| fi | yes | second |
| gj | yes | third |
| ih | yes | back |
| ji | yes | back |
| hx | yes | back |
And the relations
| type | way:from | way:via | way:to | restriction:conditional |
| restriction | ab | bc,cd,de,ef | fi | no_right_turn @ (Mo-Fr 07:00-10:30) |
And the relations
| type | way:from | node:via | way:to | restriction:conditional |
| restriction | de | e | eh | no_right_turn @ (Mo-Fr 07:00-10:30) |
| restriction | de | e | eh | only_right_turn @ (Sa-Su 07:00-10:30) |
When I route I should get
| from | to | route |
| 1 | x | forward,third,back,back |
| 2 | x | forward,second,back,back |
| 3 | x | forward,second,back,back |
| 4 | x | forward,second,back,back |
| 5 | x | forward,third,back,back |
| 7 | x | first,back,back |
| 8 | x | second,back,back |
| 9 | x | third,back,back |
@restriction-way @no_turning @overlap
Scenario: Car - Multiple via restriction inside multiple via restriction
Given the node map
"""
1 2 3 4 5
a---b---c---d---e---------f---------g
| | |
|7 |8 |9
| | |
x---h---------i---------j
"""
And the ways
| nodes | oneway | name |
| ab | yes | forward |
| bc | yes | forward |
| cd | yes | forward |
| de | yes | forward |
| ef | yes | forward |
| fg | yes | forward |
| eh | yes | first |
| fi | yes | second |
| gj | yes | third |
| ih | yes | back |
| ji | yes | back |
| hx | yes | back |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc,cd,de,ef | fi | no_right_turn |
| restriction | bc | cd,de | eh | no_right_turn |
When I route I should get
| from | to | route |
| 1 | x | forward,third,back,back |
| 2 | x | forward,second,back,back |
| 3 | x | forward,first,back,back |
| 4 | x | forward,second,back,back |
| 5 | x | forward,third,back,back |
| 7 | x | first,back,back |
| 8 | x | second,back,back |
| 9 | x | third,back,back |
@restriction-way @no_turning @overlap @conditionals
Scenario: Car - Conditional multiple via restriction inside conditional multiple via restriction
Given a grid size of 200 meters
Given the origin -9.2972,10.3811
# coordinate in Guinée, a country that observes GMT year round
Given the extract extra arguments "--parse-conditional-restrictions"
# time stamp for 10am on Tues, 02 May 2017 GMT
Given the contract extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the customize extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the node map
"""
1 2 3 4 5
a---b---c---d---e---------f---------g
| | |
|7 |8 |9
| | |
x---h---------i---------j
"""
And the ways
| nodes | oneway | name |
| ab | yes | forward |
| bc | yes | forward |
| cd | yes | forward |
| de | yes | forward |
| ef | yes | forward |
| fg | yes | forward |
| eh | yes | first |
| fi | yes | second |
| gj | yes | third |
| ih | yes | back |
| ji | yes | back |
| hx | yes | back |
And the relations
| type | way:from | way:via | way:to | restriction:conditional |
| restriction | ab | bc,cd,de,ef | fi | no_right_turn @ (Mo-Fr 07:00-10:30) |
| restriction | bc | cd,de | eh | no_right_turn @ (Mo-Fr 07:00-10:30) |
| restriction | bc | cd,de | eh | only_right_turn @ (Sa-Su 07:00-10:30) |
When I route I should get
| from | to | route |
| 1 | x | forward,third,back,back |
| 2 | x | forward,second,back,back |
| 3 | x | forward,first,back,back |
| 4 | x | forward,second,back,back |
| 5 | x | forward,third,back,back |
| 7 | x | first,back,back |
| 8 | x | second,back,back |
| 9 | x | third,back,back |
@restriction-way @only_turning @overlap
Scenario: Car - Overlapping multiple via restrictions
Given the node map
"""
a f j
| | |
b---d---e---i---k----m
| | |
c g l
"""
And the ways
| nodes | oneway | name |
| ab | yes | down |
| cb | yes | up |
| bd | yes | right |
| de | yes | right |
| ef | yes | up |
| eg | yes | down |
| ei | yes | right |
| ik | yes | right |
| kj | yes | up |
| kl | yes | down |
| km | yes | right |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bd,de | ei | only_straight_on |
| restriction | de | ei,ik | km | only_straight_on |
When I route I should get
| from | to | route |
| a | f | |
| a | g | |
| a | j | |
| a | l | |
| a | m | down,right,right |
| c | f | up,right,up,up |
| c | g | up,right,down,down |
| c | j | |
| c | l | |
| c | m | up,right,right |
| i | j | right,up,up |
| i | l | right,down,down |
| i | m | right,right |
@restriction-way @only_turning @overlap @conditionals
Scenario: Car - Overlapping conditional multiple via restrictions
Given a grid size of 200 meters
Given the origin -9.2972,10.3811
# coordinate in Guinée, a country that observes GMT year round
Given the extract extra arguments "--parse-conditional-restrictions"
# time stamp for 10am on Tues, 02 May 2017 GMT
Given the contract extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the customize extra arguments "--time-zone-file=test/data/tz/{timezone_names}/guinea.geojson --parse-conditionals-from-now=1493719200"
Given the node map
"""
a f j
| | |
b---d---e---i---k----m
| | |
c g l
"""
And the ways
| nodes | oneway | name |
| ab | yes | down |
| cb | yes | up |
| bd | yes | right |
| db | yes | left |
| de | yes | right |
| ed | yes | left |
| ef | yes | up |
| eg | yes | down |
| ei | yes | right |
| ie | yes | left |
| ik | yes | right |
| ki | yes | left |
| kj | yes | up |
| kl | yes | down |
| km | no | end |
And the relations
| type | way:from | way:via | way:to | restriction:conditional |
| restriction | ab | bd,de | ei | only_straight_on @ (Mo-Fr 07:00-10:30) |
| restriction | ab | bd,de | ef | only_left_turn @ (Sa-Su 07:00-10:30) |
| restriction | de | ei,ik | km | only_straight_on @ (Mo-Fr 07:00-10:30) |
When I route I should get
| from | to | route |
| a | f | down,right,end,end,left,up,up |
| a | g | down,right,end,end,left,down,down |
| a | j | down,right,end,end,up,up |
| a | l | down,right,end,end,down,down |
| a | m | down,right,end,end |
| c | f | up,right,up,up |
| c | g | up,right,down,down |
| c | j | up,right,end,end,up,up |
| c | l | up,right,end,end,down,down |
| c | m | up,right,end,end |
| i | j | right,up,up |
| i | l | right,down,down |
| i | m | right,end,end |
@restriction-way @only_turning @geometry
Scenario: Car - Multiple via restriction with non-compressable via geometry
Given the node map
"""
a---b---c---d---e---f---g---h
| | |
i j k
"""
And the ways
| nodes | oneway | name |
| ab | yes | right |
| bcd | yes | right |
| defg | yes | right |
| ci | yes | down |
| ej | yes | down |
| gh | yes | end |
| gk | yes | down |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bcd,defg | gh | only_straight_on |
When I route I should get
| from | to | route |
| a | h | right,end,end |
| a | k | |
@restriction-way @only_turning @geometry
Scenario: Car - Multiple via restriction with non-compressable from/to nodes
Given the node map
"""
a---b---c---d---e---f---g---h---i---j---k---l
| | | | |
m n o p q
"""
And the ways
| nodes | oneway | name |
| abcdefg | yes | right |
| ghi | yes | right |
| ijkl | yes | end |
| cm | yes | down |
| en | yes | down |
| go | yes | down |
| ip | yes | down |
| kq | yes | down |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | abcdefg | ghi | ijkl | only_straight_on |
When I route I should get
| from | to | route |
| a | l | right,end,end |
| a | p | |
@restriction-way @no_turning
Scenario: Car - Long unrestricted route and short restricted route
Given the node map
"""
a------------------------------------b
| |
c--d--e--f---------------------------
"""
And the ways
| nodes |
| ac |
| ab |
| bf |
| cd |
| de |
| ef |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ac | cd | de | no_straight_on |
When I route I should get
| from | to | route |
| a | f | ab,bf,bf |
@restriction-way @overlap @no_turning
Scenario: Car - Junction with multiple via u-turn restrictions
# Example: https://www.openstreetmap.org/#map=19/52.07399/5.09724
Given the node map
"""
a b
| |
c---d---e---f
| |
g---h---i---j
| |
k l
"""
And the ways
| nodes | oneway | name |
| ad | yes | down |
| eb | yes | up |
| fe | yes | left |
| ij | yes | right |
| li | yes | up |
| hk | yes | down |
| gh | yes | right |
| dc | yes | left |
| dh | yes | down |
| hi | yes | right |
| ie | yes | up |
| ed | yes | left |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ad | dh,hi | ie | no_u_turn |
| restriction | li | ie,ed | dh | no_u_turn |
When I route I should get
| from | to | route |
| a | b | |
| a | c | down,left,left |
| a | k | down,down |
| a | j | down,right,right |
| f | b | left,up,up |
| f | c | left,left |
| f | k | left,down,down |
| f | j | left,down,right,right |
| l | b | up,up |
| l | c | up,left,left |
| l | k | |
| l | j | up,right,right |
| g | b | right,up,up |
| g | c | right,up,left,left |
| g | k | right,down,down |
| g | j | right,right |
@restriction-way @overlap @no_turning
Scenario: Car - Junction with multiple via u-turn restrictions, service roads
# Example: https://www.openstreetmap.org/#map=19/48.38566/10.88068
Given the node map
"""
a b
| |
c---d--e--f---g
| _/|
h__/ |
|\ \ |
i---j-k-l-m---n
| |
o p
"""
And the ways
| nodes | oneway | name |
| ad | yes | down |
| fb | yes | up |
| gf | yes | left |
| mn | yes | right |
| pm | yes | up |
| jo | yes | down |
| ij | yes | right |
| dc | yes | left |
| dh | yes | down |
| hj | yes | down |
| jkl | yes | right |
| lm | yes | right |
| mf | yes | up |
| fe | yes | left |
| ed | yes | left |
And the ways
| nodes | oneway | name | highway | access | psv |
| kh | yes | service | service | no | yes |
| lh | no | service | service | no | yes |
| fh | yes | service | service | no | yes |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | hj | jkl,lm | mf | no_u_turn |
| restriction | lm | mf | fe | no_u_turn |
| restriction | mf | fe,ed | dh | no_u_turn |
| restriction | ed | dh,hj | jkl | no_u_turn |
When I route I should get
| from | to | route |
| a | b | |
| a | c | down,left,left |
| a | o | down,down |
| a | n | down,right,right |
| i | b | right,up,up |
| i | c | |
| i | o | right,down,down |
| i | n | right,right |
| p | b | up,up |
| p | c | up,left,left |
| p | o | |
| p | n | up,right,right |
| g | b | left,up,up |
| g | c | left,left |
| g | o | left,down,down |
| g | n | |
@restriction-way @overlap @no_turning
Scenario: Car - Junction with overlapping and duplicate multiple via restrictions
# Example: https://www.openstreetmap.org/#map=19/34.66291/33.01711
Given the profile file "car" initialized with
"""
profile.properties.left_hand_driving = true
"""
And the node map
"""
a b
| |
c---d---e---f
| |
g---h---i---j
| |
k l
"""
And the nodes
| node | highway |
| d | traffic_signals |
| e | traffic_signals |
| h | traffic_signals |
| i | traffic_signals |
And the ways
| nodes | oneway | name |
| da | yes | up |
| be | yes | down |
| ef | yes | right |
| ji | yes | left |
| il | yes | down |
| kh | yes | up |
| hg | yes | left |
| cd | yes | right |
| hd | yes | up |
| ih | yes | left |
| ei | yes | down |
| de | yes | right |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | be | ei,ih | hd | no_u_turn |
| restriction | ji | ih,hd | de | no_u_turn |
| restriction | kh | hd,de | ei | no_u_turn |
| restriction | cd | de,ei | ih | no_u_turn |
| restriction | hd | de | ei | no_u_turn |
| restriction | de | ei | ih | no_u_turn |
| restriction | ei | ih | hd | no_u_turn |
| restriction | ei | ih,hd | de | no_u_turn |
| restriction | ih | hd | de | no_u_turn |
| restriction | ih | hd,de | ei | no_u_turn |
When I route I should get
| from | to | route |
| b | a | |
| b | g | down,left,left |
| b | l | down,down |
| b | f | down,right,right |
| j | a | left,up,up |
| j | g | left,left |
| j | l | left,down,down |
| j | f | |
| k | a | up,up |
| k | g | up,left,left |
| k | l | |
| k | f | up,right,right |
| c | a | right,up,up |
| c | g | |
| c | l | right,down,down |
| c | f | right,right |
@restriction-way @no_turning
Scenario: Car - Junction with multiple via restriction to side road, traffic lights
# Example: https://www.openstreetmap.org/#map=19/48.23662/16.42545
Given the node map
"""
e---d
|
f---c---g
|
h---b---i
|
a
"""
And the nodes
| node | highway |
| c | traffic_signals |
| b | traffic_signals |
And the ways
| nodes | oneway | name |
| ab | no | up |
| bc | no | up |
| cd | no | up |
| de | no | left |
| hb | yes | right |
| bi | yes | right |
| gc | yes | left |
| cf | yes | left |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc,cd | de | no_left_turn |
When I route I should get
| from | to | route |
| a | e | |
| a | f | up,left,left |
| a | g | |
| a | h | |
| a | i | up,right,right |
@restriction-way @overlap @no_turning
Scenario: Car - Many overlapping multiple via restrictions, traffic signals
# Example: https://www.openstreetmap.org/#map=19/48.76987/11.43410
Given the node map
"""
8 5
p______a_______n________o__x
1| | |
| \ /
r___q____b____ m
| \ \___ _/ 7
\ c _l____k__w
s \ _/ _/
\ _d/ __j
\ _/ \ _/
| ___g e_____i
v__t__/ _/ \ 4
6 2/ 3\
f h
"""
And the nodes
| node | highway |
| n | traffic_signals |
| m | traffic_signals |
| q | traffic_signals |
And the ways
| nodes | oneway |
| on | yes |
| na | yes |
| ap | yes |
| pr | yes |
| rqb | yes |
| bl | yes |
| oml | yes |
| ld | yes |
| lk | yes |
| ba | yes |
| bcd | no |
| de | no |
| eh | no |
| ei | no |
| ejk | yes |
| rst | yes |
| dgt | yes |
| fe | yes |
| xo | yes |
| tv | yes |
| kw | yes |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | pr | rqb,bcd | dgt | no_right_turn |
| restriction | rqb | bcd,de | ejk | no_left_turn |
| restriction | rqb | bcd | dgt | no_right_turn |
| restriction | fe | ed | dgt | no_u_turn |
| restriction | fe | ed,dcb | bl | no_right_turn |
| restriction | he | ed,dcb | bl | no_right_turn |
| restriction | oml | ld,de | ejk | no_u_turn |
And the relations
| type | way:from | node:via | way:to | restriction |
| restriction | ap | p | pr | no_u_turn |
| restriction | rqb | b | ba | no_left_turn |
| restriction | ld | d | dcb | no_right_turn |
| restriction | oml | l | lk | no_left_turn |
| restriction | na | a | ab | no_left_turn |
| restriction | dcb | b | bl | no_right_turn |
| restriction | dcb | b | bcd | no_u_turn |
| restriction | bcd | d | dcb | no_u_turn |
| restriction | bl | l | ld | no_right_turn |
# Additional relations to prevent u-turns on small roads polluting the results
And the relations
| type | way:from | node:via | way:to | restriction |
| restriction | eh | h | he | no_u_turn |
| restriction | ei | i | ie | no_u_turn |
When I route I should get
| from | to | route | locations |
| 1 | 6 | pr,rst,tv,tv | _,r,t,_ |
| 1 | 3 | pr,rqb,bcd,de,eh,eh | _,r,b,d,e,_ |
| 1 | 4 | pr,rqb,bcd,de,ei,ei | _,r,b,d,e,_ |
| 1 | 7 | pr,rqb,bl,lk,kw,kw | _,r,b,l,k,_ |
| 1 | 8 | | |
| 2 | 6 | | |
| 2 | 3 | fe,eh,eh | _,e,_ |
| 2 | 4 | fe,ei,ei | _,e,_ |
| 2 | 7 | fe,ejk,kw,kw | _,e,k,_ |
| 2 | 8 | fe,de,bcd,ba,ap,ap | _,e,d,b,a,_ |
| 3 | 6 | eh,de,dgt,tv,tv | _,e,d,t,_ |
| 3 | 4 | eh,ei,ei | _,e,_ |
| 3 | 7 | eh,ejk,kw,kw | _,e,k,_ |
| 3 | 8 | eh,de,bcd,ba,ap,ap | _,e,d,b,a,_ |
| 4 | 6 | ei,de,dgt,tv,tv | _,e,d,t,_ |
| 4 | 3 | ei,eh,eh | _,e,_ |
| 4 | 7 | ei,ejk,kw,kw | _,e,k,_ |
| 4 | 8 | ei,de,bcd,ba,ap,ap | _,e,d,b,a,_ |
| 5 | 6 | xo,oml,ld,dgt,tv,tv | _,o,l,d,t,_ |
| 5 | 3 | xo,oml,ld,de,eh,eh | _,o,l,d,e,_ |
| 5 | 4 | xo,oml,ld,de,ei,ei | _,o,l,d,e,_ |
| 5 | 7 | | |
| 5 | 8 | xo,on,na,ap,ap | _,o,n,a,_ |
@restriction-way @overlap @no_turning
Scenario: Car - Multiple via restriction with start and end on same node
# Example: https://www.openstreetmap.org/#map=19/52.41988/16.96088
Given the node map
"""
|--g---f---e
a | |
|--b---c---d
"""
And the nodes
| node | highway |
| b | traffic_signals |
And the ways
| nodes | oneway | name |
| abc | yes | enter |
| cd | yes | right |
| de | yes | up |
| ef | yes | left |
| fga | yes | exit |
| fc | yes | down |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | abc | cd,de,ef | fga | no_u_turn |
When I route I should get
| from | to | route | locations |
| a | g | enter,right,up,left,down,right,up,left,exit,exit | a,c,d,e,f,c,d,e,f,g |
| b | a | enter,right,up,left,down,right,up,left,exit,exit | b,c,d,e,f,c,d,e,f,a |
# This is a correct but not within the spirit of the restriction.
# Does this indicate the restriction is not strong enough?
@restriction-way @no_turning
Scenario: Car - Multiple via restriction preventing bypassing main road
# Example: https://www.openstreetmap.org/#map=19/48.72429/21.25912
Given the node map
"""
a--b--c--d--e--f
\ |
--g--h--i--j
|
k
"""
And the nodes
| node | highway |
| d | traffic_signals |
| e | traffic_signals |
And the ways
| nodes | oneway | name |
| ab | yes | main |
| bc | yes | main |
| cd | yes | main |
| de | yes | main |
| ef | yes | main |
| bg | yes | side |
| gh | yes | side |
| hi | yes | side |
| ij | yes | side |
| fj | yes | turn |
| jk | yes | turn |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bg,gh,hi,ij | jk | no_right_turn |
When I route I should get
| from | to | route |
| a | k | main,turn,turn |
@restriction-way @overlap @no_turning @only_turning
Scenario: Car - Multiple via restriction with to,via,from sharing same node
# Example: https://www.openstreetmap.org/relation/3972923
Given the node map
"""
e---d
| |
a---b---c
|
f
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
| cd | yes |
| deb | yes |
| bf | yes |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc,cd,deb | bf | no_u_turn |
And the relations
| type | way:from | node:via | way:to | restriction |
| restriction | ab | b | bc | only_straight_on |
| restriction | deb | b | bc | no_left_turn |
When I route I should get
| from | to | route |
| a | f | |
# The last restriction is missing from OSM. Without it,
# it produces the route: ab,bc,cd,deb,bc,cd,deb,bf,bf
@restriction-way @except
Scenario: Car - Multiple via restriction, exception applies
# Example: https://www.openstreetmap.org/#map=19/50.04920/19.93251
Given the node map
"""
a---b---c---d--e
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
| cd | yes |
| de | yes |
And the relations
| type | way:from | way:via | way:to | restriction | except |
| restriction | ab | bc,cd | de | no_straight_on | motorcar |
When I route I should get
| from | to | route |
| a | e | ab,bc,cd,de,de |
@restriction-way @except @no_turning
Scenario: Car - Multiple via restriction, exception n/a
# Example: https://www.openstreetmap.org/#map=19/50.04920/19.93251
Given the node map
"""
a---b---c---d--e
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
| cd | yes |
| de | yes |
And the relations
| type | way:from | way:via | way:to | restriction | except |
| restriction | ab | bc,cd | de | no_straight_on | psv;emergency |
When I route I should get
| from | to | route |
| a | e | |
@restriction-way @overlap @only_turning
Scenario: Car - Multiple via restriction overlapping single via restriction
Given the node map
"""
e
|
a---b---c---d
|
f - g
|
h
"""
And the ways
| nodes | name |
| ab | abcd |
| bc | abcd |
| cd | abcd |
| hf | hfb |
| fb | hfb |
| gf | gf |
| ce | ce |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc | ce | only_left_turn |
| restriction | gf | fb,bc | cd | only_u_turn |
When I route I should get
| from | to | route | turns | locations |
| a | d | abcd,ce,ce,abcd,abcd | depart,turn left,continue uturn,turn left,arrive | a,c,e,c,d |
| a | e | abcd,ce,ce | depart,turn left,arrive | a,c,e |
| a | f | abcd,hfb,hfb | depart,turn right,arrive | a,b,f |
| g | e | gf,hfb,abcd,abcd,ce,ce | depart,turn right,turn right,continue uturn,turn right,arrive | g,f,b,d,c,e |
| g | d | gf,hfb,abcd,abcd | depart,turn right,turn right,arrive | g,f,b,d |
| h | e | hfb,abcd,ce,ce | depart,end of road right,turn left,arrive | h,b,c,e |
| h | d | hfb,abcd,abcd | depart,end of road right,arrive | h,b,d |
@restriction-way
Scenario: Ambiguous from/to ways
Given the node map
"""
a
|
b---d---e
| |
c f
"""
And the ways
| nodes |
| abc |
| bd |
| de |
| ef |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | abc | bd,de | ef | no_right_turn |
| restriction | ef | de,bd | abc | no_right_turn |
When I route I should get
| from | to | route | locations |
| a | f | abc,bd,de,ef,ef | a,b,d,e,f |
| f | a | ef,de,bd,abc,abc | f,e,d,b,a |
| c | f | abc,bd,de,ef,ef | c,b,d,e,f |
| f | c | ef,de,bd,abc,abc | f,e,d,b,c |
@restriction-way
Scenario: Ambiguous via ways
Given the node map
"""
a
|
b---d---e---c
|
f
"""
And the ways
| nodes |
| ab |
| bd |
| dec |
| ef |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bd,dec | ef | no_right_turn |
| restriction | ef | dec,bd | ab | no_right_turn |
When I route I should get
| from | to | route | locations |
| a | f | ab,bd,dec,ef,ef | a,b,d,e,f |
| f | a | ef,dec,bd,ab,ab | f,e,d,b,a |
@restriction-way @invalid
Scenario: Badly tagged restrictions
Given the node map
"""
a--b--c--d--e--f
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
| cd | yes |
| de | yes |
| ef | yes |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | cd,de | ef | no_straight_on |
| restriction | ab | bc,de | ef | no_straight_on |
| restriction | ab | bc,cd | ef | no_straight_on |
| restriction | ef | de,cd | bc | no_straight_on |
When I route I should get
| from | to | route | locations |
| a | f | ab,bc,cd,de,ef,ef | a,b,c,d,e,f |
@restriction-way
Scenario: Snap source/target to via restriction way
Given the node map
"""
a-1-b-2-c-3-d
"""
And the ways
| nodes |
| ab |
| bc |
| cd |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | ab | bc | cd | no_straight_on |
When I route I should get
| from | to | route |
| 1 | 2 | ab,bc,bc |
| 2 | 3 | bc,cd,cd |
@restriction-way
Scenario: Car - Snap source/target to multi-via restriction way
# Example: https://www.openstreetmap.org/relation/11787041
Given the node map
"""
|--g---f---e
a | 1
|--b---c---d
"""
And the nodes
| node | highway |
| b | traffic_signals |
And the ways
| nodes | oneway | name |
| ab | yes | enter |
| bc | yes | enter |
| cd | yes | right |
| de | yes | up |
| ef | yes | left |
| fc | yes | down |
| fg | yes | exit |
| ga | yes | exit |
And the relations
| type | way:from | way:via | way:to | restriction |
| restriction | bc | cd,de,ef | fg | no_u_turn |
When I route I should get
| from | to | route | locations |
| a | 1 | enter,right,up,up | a,c,d,_ |
| 1 | a | up,left,exit,exit | _,e,f,a |