diff --git a/features/car/maxspeed.feature b/features/car/maxspeed.feature index 8f85d3a67..781f4c617 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 | | | 32 km/h | 32 km/h | + | primary | 60 | | | | 59 km/h | 59 km/h | + | primary | 60 | 3 | | | 30 km/h | 30 km/h | + | primary | | | 60 | | 59 km/h | 63 km/h | + | primary | | 3 | 60 | | 30 km/h | 32 km/h | + | primary | | | | 60 | 63 km/h | 59 km/h | + | primary | | 3 | | 60 | 32 km/h | 30 km/h | + | primary | 15 | | 60 | | 59 km/h | 23 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 | 7 km/h | 30 km/h | + | primary | 15 | | 30 | 60 | 34 km/h | 59 km/h | + | primary | 15 | 3 | 30 | 60 | 15 km/h | 30 km/h | + diff --git a/profiles/car.lua b/profiles/car.lua index 27d0d2343..a2b76388d 100644 --- a/profiles/car.lua +++ b/profiles/car.lua @@ -248,6 +248,12 @@ 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*")) + 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 +391,24 @@ 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; + local scaled_speed = result.forward_speed*speed_reduction + 11; + local penalized_speed = math.huge + if width <= 3 then + 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 + penalized_speed = result.backward_speed / 2; + end + result.backward_speed = math.min(penalized_speed, scaled_speed) end end