From 4c4c126361dc23bca68863e9d731de970e50f77e Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 19 Feb 2015 15:17:04 +0100 Subject: [PATCH 1/3] implements a penalty for very narrow road: - implements discussion of #1388 - implements basic test cases --- features/car/maxspeed.feature | 20 ++++++++++++++++++++ profiles/car.lua | 15 +++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/features/car/maxspeed.feature b/features/car/maxspeed.feature index 8f85d3a67..3bc1ad03f 100644 --- a/features/car/maxspeed.feature +++ b/features/car/maxspeed.feature @@ -73,3 +73,23 @@ OSRM will use 4/5 of the projected free-flow speed. | runway | | | 100 | | | | | runway | | | | 100 | | | | runway | | | | | 100 | | + + Scenario: Car - Too narrow streets should be ignored or incur a penalty + Then routability should be + + | highway | maxspeed | width | maxspeed:forward | maxspeed:backward | forw | backw | + | primary | | | | | 63 km/h | 63 km/h | + | primary | | 3 | | | 31 km/h | 31 km/h | + | primary | 60 | | | | 59 km/h | 59 km/h | + | primary | 60 | 3 | | | 29 km/h | 29 km/h | + | primary | | | 60 | | 59 km/h | 63 km/h | + | primary | | 3 | 60 | | 29 km/h | 31 km/h | + | primary | | | | 60 | 63 km/h | 59 km/h | + | primary | | 3 | | 60 | 31 km/h | 29 km/h | + | primary | 15 | | 60 | | 59 km/h | 23 km/h | + | primary | 15 | 3 | 60 | | 29 km/h | 11 km/h | + | primary | 15 | | | 60 | 23 km/h | 59 km/h | + | primary | 15 | 3 | | 60 | 11 km/h | 29 km/h | + | primary | 15 | | 30 | 60 | 34 km/h | 59 km/h | + | primary | 15 | 3 | 30 | 60 | 17 km/h | 29 km/h | + diff --git a/profiles/car.lua b/profiles/car.lua index 27d0d2343..8e4d09e18 100644 --- a/profiles/car.lua +++ b/profiles/car.lua @@ -248,6 +248,13 @@ function way_function (way, result) return end + local width = math.huge + local width_string = way:get_value_by_key("width") + if width_string and tonumber(width_string:match("%d*")) then + width = tonumber(width_string:match("%d*")) + io.write("width: "..width.."\n") + end + -- Check if we are allowed to access the way local access = find_access_tag(way, access_tags_hierachy) if access_tag_blacklist[access] then @@ -385,12 +392,20 @@ function way_function (way, result) result.ignore_in_grid = true end + -- scale speeds to get better avg driving times if result.forward_speed > 0 then result.forward_speed = result.forward_speed*speed_reduction + 11; + if width <= 3 then + result.forward_speed = result.forward_speed / 2; + end end + if result.backward_speed > 0 then result.backward_speed = result.backward_speed*speed_reduction + 11; + if width <= 3 then + result.backward_speed = result.backward_speed / 2; + end end end From a85fe2cb08cfa2d7f875d4d8d9cec45418930d79 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 19 Feb 2015 16:22:46 +0100 Subject: [PATCH 2/3] remove debug output, thx @emiltin --- profiles/car.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/profiles/car.lua b/profiles/car.lua index 8e4d09e18..24fdc2925 100644 --- a/profiles/car.lua +++ b/profiles/car.lua @@ -252,7 +252,6 @@ function way_function (way, result) local width_string = way:get_value_by_key("width") if width_string and tonumber(width_string:match("%d*")) then width = tonumber(width_string:match("%d*")) - io.write("width: "..width.."\n") end -- Check if we are allowed to access the way From b89c7580e63c3a77455ea80bf0feec244a8e47e8 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Fri, 20 Feb 2015 10:28:49 +0100 Subject: [PATCH 3/3] implement scaling for narrow roads as an alternative expected speed and take the minimum. Follows @emiltin's idea. --- features/car/maxspeed.feature | 14 +++++++------- profiles/car.lua | 12 ++++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/features/car/maxspeed.feature b/features/car/maxspeed.feature index 3bc1ad03f..781f4c617 100644 --- a/features/car/maxspeed.feature +++ b/features/car/maxspeed.feature @@ -79,17 +79,17 @@ OSRM will use 4/5 of the projected free-flow speed. | highway | maxspeed | width | maxspeed:forward | maxspeed:backward | forw | backw | | primary | | | | | 63 km/h | 63 km/h | - | primary | | 3 | | | 31 km/h | 31 km/h | + | primary | | 3 | | | 32 km/h | 32 km/h | | primary | 60 | | | | 59 km/h | 59 km/h | - | primary | 60 | 3 | | | 29 km/h | 29 km/h | + | primary | 60 | 3 | | | 30 km/h | 30 km/h | | primary | | | 60 | | 59 km/h | 63 km/h | - | primary | | 3 | 60 | | 29 km/h | 31 km/h | + | primary | | 3 | 60 | | 30 km/h | 32 km/h | | primary | | | | 60 | 63 km/h | 59 km/h | - | primary | | 3 | | 60 | 31 km/h | 29 km/h | + | primary | | 3 | | 60 | 32 km/h | 30 km/h | | primary | 15 | | 60 | | 59 km/h | 23 km/h | - | primary | 15 | 3 | 60 | | 29 km/h | 11 km/h | + | primary | 15 | 3 | 60 | | 30 km/h | 7 km/h | | primary | 15 | | | 60 | 23 km/h | 59 km/h | - | primary | 15 | 3 | | 60 | 11 km/h | 29 km/h | + | primary | 15 | 3 | | 60 | 7 km/h | 30 km/h | | primary | 15 | | 30 | 60 | 34 km/h | 59 km/h | - | primary | 15 | 3 | 30 | 60 | 17 km/h | 29 km/h | + | primary | 15 | 3 | 30 | 60 | 15 km/h | 30 km/h | diff --git a/profiles/car.lua b/profiles/car.lua index 24fdc2925..a2b76388d 100644 --- a/profiles/car.lua +++ b/profiles/car.lua @@ -394,17 +394,21 @@ function way_function (way, result) -- scale speeds to get better avg driving times if result.forward_speed > 0 then - result.forward_speed = result.forward_speed*speed_reduction + 11; + local scaled_speed = result.forward_speed*speed_reduction + 11; + local penalized_speed = math.huge if width <= 3 then - result.forward_speed = result.forward_speed / 2; + penalized_speed = result.forward_speed / 2; end + result.forward_speed = math.min(penalized_speed, scaled_speed) end if result.backward_speed > 0 then - result.backward_speed = result.backward_speed*speed_reduction + 11; + local scaled_speed = result.backward_speed*speed_reduction + 11; + local penalized_speed = math.huge if width <= 3 then - result.backward_speed = result.backward_speed / 2; + penalized_speed = result.backward_speed / 2; end + result.backward_speed = math.min(penalized_speed, scaled_speed) end end