Directional Destination Tags (#3061)
* cucumber test scenarios, #3027 * post review comments * two tests are still failing * fixed one test * passing tests * cleaner code refactor * possible sceanrios for destination:ref:forward/backward * added code for direction:ref:forward/backward, tests pass * changelog * store direction in variable * added tags to taginfo * fixed dumb error * use boolean flags * null pointer checks * hopefully better null pointer checks
This commit is contained in:
parent
f77a2474ea
commit
3f0f0e306b
@ -1,3 +1,9 @@
|
|||||||
|
# 5.5.1
|
||||||
|
- Changes from 5.5.0
|
||||||
|
- Profiles:
|
||||||
|
- Handle `destination:forward`, `destination:backward`, `destination:ref:forward`, `destination:ref:backward` tags
|
||||||
|
- Properly handle destinations on `oneway=-1` roads
|
||||||
|
|
||||||
# 5.5.0
|
# 5.5.0
|
||||||
- Changes from 5.4.0
|
- Changes from 5.4.0
|
||||||
- API:
|
- API:
|
||||||
|
43
features/guidance/directional-destination-signs.feature
Normal file
43
features/guidance/directional-destination-signs.feature
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
@routing @guidance
|
||||||
|
Feature: Destination Signs
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given the profile "car"
|
||||||
|
|
||||||
|
Scenario: Car - route name assembly with destination signs accounting for directional tags
|
||||||
|
Given the node map
|
||||||
|
"""
|
||||||
|
a b
|
||||||
|
c d
|
||||||
|
e f
|
||||||
|
g h
|
||||||
|
i j
|
||||||
|
k l
|
||||||
|
m n
|
||||||
|
o p
|
||||||
|
q r
|
||||||
|
"""
|
||||||
|
|
||||||
|
And the ways
|
||||||
|
| nodes | name | ref | destination | destination:ref | destination:forward | destination:backward | oneway | # |
|
||||||
|
| ab | AB | | Berlin | | | | yes | |
|
||||||
|
| cd | CD | | | | Berlin | | yes | |
|
||||||
|
| ef | EF | | | | Berlin | Hamburg | -1 | |
|
||||||
|
| gh | GH | | | A1 | | | yes | |
|
||||||
|
| ij | IJ | | Berlin | A1 | | | no | mis-tagged destination: not a oneway |
|
||||||
|
| kl | KL | | | A1 | Berlin | Hamburg | yes | |
|
||||||
|
| mn | MN | | Berlin | A1 | Berlin | Hamburg | yes | |
|
||||||
|
| op | OP | | Berlin | | | Hamburg | -1 | |
|
||||||
|
| qr | QR | | | | | Hamburg | -1 | |
|
||||||
|
|
||||||
|
When I route I should get
|
||||||
|
| from | to | route | destinations | ref | # |
|
||||||
|
| a | b | AB,AB | Berlin,Berlin | , | |
|
||||||
|
| c | d | CD,CD | Berlin,Berlin | , | |
|
||||||
|
| f | e | EF,EF | Hamburg,Hamburg | , | |
|
||||||
|
| g | h | GH,GH | A1,A1 | , | |
|
||||||
|
| i | j | IJ,IJ | , | , | guard against mis-tagging |
|
||||||
|
| k | l | KL,KL | A1: Berlin,A1: Berlin | , | |
|
||||||
|
| m | n | MN,MN | A1: Berlin,A1: Berlin | , | |
|
||||||
|
| p | o | OP,OP | Hamburg,Hamburg | , | |
|
||||||
|
| r | q | QR,QR | Hamburg,Hamburg | , | |
|
39
features/guidance/directional-ref-destination-signs.feature
Normal file
39
features/guidance/directional-ref-destination-signs.feature
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
@routing @guidance
|
||||||
|
Feature: Destination Signs
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given the profile "car"
|
||||||
|
|
||||||
|
Scenario: Car - route name assembly with destination signs accounting for directional:ref tags
|
||||||
|
Given the node map
|
||||||
|
"""
|
||||||
|
a b
|
||||||
|
c d
|
||||||
|
e f
|
||||||
|
g h
|
||||||
|
i j
|
||||||
|
k l
|
||||||
|
m n
|
||||||
|
o p
|
||||||
|
q r
|
||||||
|
"""
|
||||||
|
|
||||||
|
And the ways
|
||||||
|
| nodes | name | destination | destination:ref | destination:ref:forward | destination:ref:backward | destination:forward | destination:backward | oneway | # |
|
||||||
|
| ab | AB | Berlin | A1 | A1 | A2 | | | yes | |
|
||||||
|
| cd | CD | | A1 | A1 | A2 | Berlin | Hamburg | -1 | |
|
||||||
|
| ef | EF | | | A1 | A2 | Berlin | Hamburg | yes | |
|
||||||
|
| gh | GH | | | A1 | A2 | Berlin | Hamburg | -1 | |
|
||||||
|
| ij | IJ | Berlin | A1 | | A2 | Berlin | Hamburg | yes | |
|
||||||
|
| kl | KL | | A1 | | A2 | Berlin | Hamburg | -1 | |
|
||||||
|
| mn | MN | Berlin | A1 | A1 | | Berlin | Hamburg | no | mis-tagged destination: not a oneway |
|
||||||
|
|
||||||
|
When I route I should get
|
||||||
|
| from | to | route | destinations | ref | # |
|
||||||
|
| a | b | AB,AB | A1: Berlin,A1: Berlin | , | |
|
||||||
|
| d | c | CD,CD | A2: Hamburg,A2: Hamburg | , | |
|
||||||
|
| e | f | EF,EF | A1: Berlin,A1: Berlin | , | |
|
||||||
|
| h | g | GH,GH | A2: Hamburg,A2: Hamburg | , | |
|
||||||
|
| i | j | IJ,IJ | A1: Berlin,A1: Berlin | , | |
|
||||||
|
| l | k | KL,KL | A2: Hamburg,A2: Hamburg | , | |
|
||||||
|
| m | n | MN,MN | , | , | guard against mis-tagging |
|
@ -498,20 +498,19 @@ function way_function (way, result)
|
|||||||
-- Set direction according to tags on way
|
-- Set direction according to tags on way
|
||||||
if obey_oneway then
|
if obey_oneway then
|
||||||
if oneway == "-1" then
|
if oneway == "-1" then
|
||||||
|
local is_forward = false
|
||||||
result.forward_mode = mode.inaccessible
|
result.forward_mode = mode.inaccessible
|
||||||
|
result.destinations = get_destination(way, is_forward)
|
||||||
elseif oneway == "yes" or
|
elseif oneway == "yes" or
|
||||||
oneway == "1" or
|
oneway == "1" or
|
||||||
oneway == "true" or
|
oneway == "true" or
|
||||||
junction == "roundabout" or
|
junction == "roundabout" or
|
||||||
(highway == "motorway" and oneway ~= "no") then
|
(highway == "motorway" and oneway ~= "no") then
|
||||||
|
local is_forward = true
|
||||||
result.backward_mode = mode.inaccessible
|
result.backward_mode = mode.inaccessible
|
||||||
|
result.destinations = get_destination(way, is_forward)
|
||||||
-- If we're on a oneway and there is no ref tag, re-use destination tag as ref.
|
|
||||||
local destination = get_destination(way)
|
|
||||||
local has_destination = destination and "" ~= destination
|
|
||||||
|
|
||||||
result.destinations = destination
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Override speed settings if explicit forward/backward maxspeeds are given
|
-- Override speed settings if explicit forward/backward maxspeeds are given
|
||||||
|
@ -1,24 +1,50 @@
|
|||||||
local Destination = {}
|
local Destination = {}
|
||||||
|
|
||||||
function Destination.get_destination(way)
|
function Destination.get_destination(way, is_forward)
|
||||||
local destination = way:get_value_by_key("destination")
|
local destination = way:get_value_by_key("destination")
|
||||||
|
local destination_forward = way:get_value_by_key("destination:forward")
|
||||||
|
local destination_backward = way:get_value_by_key("destination:backward")
|
||||||
local destination_ref = way:get_value_by_key("destination:ref")
|
local destination_ref = way:get_value_by_key("destination:ref")
|
||||||
|
local destination_ref_forward = way:get_value_by_key("destination:ref:forward")
|
||||||
|
local destination_ref_backward = way:get_value_by_key("destination:ref:backward")
|
||||||
|
|
||||||
-- Assemble destination as: "A59: Düsseldorf, Köln"
|
-- Assemble destination as: "A59: Düsseldorf, Köln"
|
||||||
-- destination:ref ^ ^ destination
|
-- destination:ref ^ ^ destination
|
||||||
|
|
||||||
local rv = ""
|
local rv = ""
|
||||||
|
|
||||||
if destination_ref and destination_ref ~= "" then
|
if destination_ref then
|
||||||
|
if is_forward == true and destination_ref == "" then
|
||||||
|
if destination_ref_forward then
|
||||||
|
destination_ref = destination_ref_forward
|
||||||
|
end
|
||||||
|
elseif is_forward == false then
|
||||||
|
if destination_ref_backward then
|
||||||
|
destination_ref = destination_ref_backward
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
rv = rv .. string.gsub(destination_ref, ";", ", ")
|
rv = rv .. string.gsub(destination_ref, ";", ", ")
|
||||||
end
|
end
|
||||||
|
|
||||||
if destination and destination ~= "" then
|
if destination then
|
||||||
|
if is_forward == true and destination == "" then
|
||||||
|
if destination_forward then
|
||||||
|
destination = destination_forward
|
||||||
|
end
|
||||||
|
elseif is_forward == false then
|
||||||
|
if destination_backward then
|
||||||
|
destination = destination_backward
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if destination ~= "" then
|
||||||
if rv ~= "" then
|
if rv ~= "" then
|
||||||
rv = rv .. ": "
|
rv = rv .. ": "
|
||||||
end
|
end
|
||||||
|
|
||||||
rv = rv .. string.gsub(destination, ";", ", ")
|
rv = rv .. string.gsub(destination, ";", ", ")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return rv
|
return rv
|
||||||
|
20
taginfo.json
20
taginfo.json
@ -318,11 +318,31 @@
|
|||||||
"object_types": [ "way" ],
|
"object_types": [ "way" ],
|
||||||
"description": "Destination of road for navigation instructions, supplements name."
|
"description": "Destination of road for navigation instructions, supplements name."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"key": "destination:forward",
|
||||||
|
"object_types": [ "way" ],
|
||||||
|
"description": "Destination and direction of road for oneways for navigation instructions, supplements name."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "destination:backward",
|
||||||
|
"object_types": [ "way" ],
|
||||||
|
"description": "Destination and direction of road for oneways for navigation instructions, supplements name."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "destination:ref",
|
"key": "destination:ref",
|
||||||
"object_types": [ "way" ],
|
"object_types": [ "way" ],
|
||||||
"description": "Destination of road for navigation instructions, supplements name."
|
"description": "Destination of road for navigation instructions, supplements name."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"key": "destination:ref:forward",
|
||||||
|
"object_types": [ "way" ],
|
||||||
|
"description": "Destination and direction of road for oneways for navigation instructions, supplements name."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "destination:ref:backward",
|
||||||
|
"object_types": [ "way" ],
|
||||||
|
"description": "Destination and direction of road for oneways for navigation instructions, supplements name."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "junction",
|
"key": "junction",
|
||||||
"object_types": [ "way" ],
|
"object_types": [ "way" ],
|
||||||
|
Loading…
Reference in New Issue
Block a user