From 783d455bd7ff650771c266f7c519d8ea1fe3fd46 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Wed, 18 Nov 2015 18:46:29 +0100 Subject: [PATCH] Add support for advisory speed limits This adds support for the maxspeed:advisory class of speed tags. --- features/car/advisory.feature | 67 +++++++++++++++++++++++++++++++++++ profiles/car.lua | 27 ++++++++++++-- 2 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 features/car/advisory.feature diff --git a/features/car/advisory.feature b/features/car/advisory.feature new file mode 100644 index 000000000..db5e66d4a --- /dev/null +++ b/features/car/advisory.feature @@ -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 | + + diff --git a/profiles/car.lua b/profiles/car.lua index fe6ac5d95..d246934d9 100644 --- a/profiles/car.lua +++ b/profiles/car.lua @@ -379,8 +379,8 @@ function way_function (way, result) end -- Override speed settings if explicit forward/backward maxspeeds are given - local maxspeed_forward = parse_maxspeed(way:get_value_by_key( "maxspeed:forward")) - local maxspeed_backward = parse_maxspeed(way:get_value_by_key( "maxspeed:backward")) + local maxspeed_forward = parse_maxspeed(way:get_value_by_key("maxspeed:forward")) + local maxspeed_backward = parse_maxspeed(way:get_value_by_key("maxspeed:backward")) if maxspeed_forward and maxspeed_forward > 0 then if 0 ~= result.forward_mode and 0 ~= result.backward_mode then result.backward_speed = result.forward_speed @@ -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