Add support for advisory speed limits

This adds support for the maxspeed:advisory class of speed tags.
This commit is contained in:
Patrick Niklaus 2015-11-18 18:46:29 +01:00
parent 6c35272fe2
commit 783d455bd7
2 changed files with 92 additions and 2 deletions

View File

@ -0,0 +1,67 @@
@routing @maxspeed @car
Feature: Car - Max speed restrictions
OSRM will use 4/5 of the projected free-flow speed.
Background: Use specific speeds
Given the profile "car"
Given a grid size of 1000 meters
Scenario: Car - Advisory speed overwrites maxspeed
Given the node map
| a | b | c |
And the ways
| nodes | highway | maxspeed | maxspeed:advisory |
| ab | residential | 90 | 45 |
| bc | residential | | 45 |
When I route I should get
| from | to | route | speed |
| a | b | ab | 47 km/h +- 1 |
| b | c | bc | 47 km/h +- 1 |
Scenario: Car - Advisory speed overwrites forward maxspeed
Given the node map
| a | b | c |
And the ways
| nodes | highway | maxspeed:forward | maxspeed:advisory:forward |
| ab | residential | 90 | 45 |
| bc | residential | | 45 |
When I route I should get
| from | to | route | speed |
| a | b | ab | 47 km/h +- 1 |
| b | c | bc | 47 km/h +- 1 |
Scenario: Car - Advisory speed overwrites backwards maxspeed
Given the node map
| a | b | c |
And the ways
| nodes | highway | maxspeed:backward | maxspeed:advisory:backward |
| ab | residential | 90 | 45 |
| bc | residential | | 45 |
When I route I should get
| from | to | route | speed |
| b | a | ab | 47 km/h +- 1 |
| c | b | bc | 47 km/h +- 1 |
Scenario: Car - Directional advisory speeds play nice with eachother
Given the node map
| a | b | c |
And the ways
| nodes | highway | maxspeed:advisory | maxspeed:advisory:forward | maxspeed:advisory:backward |
| ab | residential | 90 | 45 | 60 |
| bc | residential | 90 | 60 | 45 |
When I route I should get
| from | to | route | speed |
| a | b | ab | 47 km/h +- 1 |
| b | a | ab | 59 km/h +- 1 |
| b | c | bc | 59 km/h +- 1 |
| c | b | bc | 47 km/h +- 1 |

View File

@ -391,6 +391,29 @@ function way_function (way, result)
result.backward_speed = maxspeed_backward
end
-- Override speed settings if advisory forward/backward maxspeeds are given
local advisory_speed = parse_maxspeed(way:get_value_by_key("maxspeed:advisory"))
local advisory_forward = parse_maxspeed(way:get_value_by_key("maxspeed:advisory:forward"))
local advisory_backward = parse_maxspeed(way:get_value_by_key("maxspeed:advisory:backward"))
-- apply bi-directional advisory speed first
if advisory_speed and advisory_speed > 0 then
if 0 ~= result.forward_mode then
result.forward_speed = advisory_speed
end
if 0 ~= result.backward_mode then
result.backward_speed = advisory_speed
end
end
if advisory_forward and advisory_forward > 0 then
if 0 ~= result.forward_mode and 0 ~= result.backward_mode then
result.backward_speed = result.forward_speed
end
result.forward_speed = advisory_forward
end
if advisory_backward and advisory_backward > 0 then
result.backward_speed = advisory_backward
end
local width = math.huge
local lanes = math.huge
if result.forward_speed > 0 or result.backward_speed > 0 then