This is an automated email from the git hooks/post-receive script. cbaines-guest pushed a commit to branch master in repository osrm.
commit 034fcb1a1749c47e5b42d9d2679567edee13dac9 Author: Christopher Baines <m...@cbaines.net> Date: Sat Apr 4 14:43:07 2015 +0100 Update config files Copy the files from patches/ --- debian/conffiles/access.lua | 6 +- debian/conffiles/bicycle.lua | 612 ++++++++++++++++++++++-------------------- debian/conffiles/car.lua | 461 +++++++++++++++++++++---------- debian/conffiles/foot.lua | 332 ++++++++++++----------- debian/conffiles/maxspeed.lua | 17 ++ debian/conffiles/testbot.lua | 195 +++++++------- 6 files changed, 946 insertions(+), 677 deletions(-) diff --git a/debian/conffiles/access.lua b/debian/conffiles/access.lua index 094db62..76d2e2c 100644 --- a/debian/conffiles/access.lua +++ b/debian/conffiles/access.lua @@ -4,10 +4,10 @@ module "Access" function find_access_tag(source,access_tags_hierachy) for i,v in ipairs(access_tags_hierachy) do - local tag = source.tags:Find(v) - if tag ~= '' then + local tag = source:get_value_by_key(v) + if tag and tag ~= '' then return tag end end return nil -end \ No newline at end of file +end diff --git a/debian/conffiles/bicycle.lua b/debian/conffiles/bicycle.lua index 98d03c8..713c6b7 100644 --- a/debian/conffiles/bicycle.lua +++ b/debian/conffiles/bicycle.lua @@ -1,8 +1,9 @@ require("lib/access") +require("lib/maxspeed") -- Begin of globals -barrier_whitelist = { [""] = true, ["cycle_barrier"] = true, ["bollard"] = true, ["entrance"] = true, ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true} -access_tag_whitelist = { ["yes"] = true, ["permissive"] = true, ["designated"] = true } +barrier_whitelist = { [""] = true, ["cycle_barrier"] = true, ["bollard"] = true, ["entrance"] = true, ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true } +access_tag_whitelist = { ["yes"] = true, ["permissive"] = true, ["designated"] = true } access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestery"] = true } access_tag_restricted = { ["destination"] = true, ["delivery"] = true } access_tags_hierachy = { "bicycle", "vehicle", "access" } @@ -14,340 +15,375 @@ default_speed = 15 walking_speed = 6 -bicycle_speeds = { - ["cycleway"] = default_speed, - ["primary"] = default_speed, - ["primary_link"] = default_speed, - ["secondary"] = default_speed, - ["secondary_link"] = default_speed, - ["tertiary"] = default_speed, - ["tertiary_link"] = default_speed, - ["residential"] = default_speed, - ["unclassified"] = default_speed, - ["living_street"] = default_speed, - ["road"] = default_speed, - ["service"] = default_speed, - ["track"] = 12, - ["path"] = 12 - --["footway"] = 12, - --["pedestrian"] = 12, +bicycle_speeds = { + ["cycleway"] = default_speed, + ["primary"] = default_speed, + ["primary_link"] = default_speed, + ["secondary"] = default_speed, + ["secondary_link"] = default_speed, + ["tertiary"] = default_speed, + ["tertiary_link"] = default_speed, + ["residential"] = default_speed, + ["unclassified"] = default_speed, + ["living_street"] = default_speed, + ["road"] = default_speed, + ["service"] = default_speed, + ["track"] = 12, + ["path"] = 12 + --["footway"] = 12, + --["pedestrian"] = 12, } -pedestrian_speeds = { - ["footway"] = walking_speed, - ["pedestrian"] = walking_speed, - ["steps"] = 2 +pedestrian_speeds = { + ["footway"] = walking_speed, + ["pedestrian"] = walking_speed, + ["steps"] = 2 } -railway_speeds = { - ["train"] = 10, - ["railway"] = 10, - ["subway"] = 10, - ["light_rail"] = 10, - ["monorail"] = 10, - ["tram"] = 10 +railway_speeds = { + ["train"] = 10, + ["railway"] = 10, + ["subway"] = 10, + ["light_rail"] = 10, + ["monorail"] = 10, + ["tram"] = 10 } -platform_speeds = { - ["platform"] = walking_speed +platform_speeds = { + ["platform"] = walking_speed } -amenity_speeds = { - ["parking"] = 10, - ["parking_entrance"] = 10 +amenity_speeds = { + ["parking"] = 10, + ["parking_entrance"] = 10 } -man_made_speeds = { - ["pier"] = walking_speed +man_made_speeds = { + ["pier"] = walking_speed } -route_speeds = { - ["ferry"] = 5 +route_speeds = { + ["ferry"] = 5 } -surface_speeds = { - ["cobblestone:flattened"] = 10, - ["paving_stones"] = 10, - ["compacted"] = 10, - ["cobblestone"] = 6, - ["unpaved"] = 6, - ["fine_gravel"] = 6, - ["gravel"] = 6, - ["fine_gravel"] = 6, - ["pebbelstone"] = 6, - ["ground"] = 6, - ["dirt"] = 6, - ["earth"] = 6, - ["grass"] = 6, - ["mud"] = 3, - ["sand"] = 3 +surface_speeds = { + ["asphalt"] = default_speed, + ["cobblestone:flattened"] = 10, + ["paving_stones"] = 10, + ["compacted"] = 10, + ["cobblestone"] = 6, + ["unpaved"] = 6, + ["fine_gravel"] = 6, + ["gravel"] = 6, + ["fine_gravel"] = 6, + ["pebbelstone"] = 6, + ["ground"] = 6, + ["dirt"] = 6, + ["earth"] = 6, + ["grass"] = 6, + ["mud"] = 3, + ["sand"] = 3 } -take_minimum_of_speeds = true -obey_oneway = true -obey_bollards = false -use_restrictions = true -ignore_areas = true -- future feature -traffic_signal_penalty = 5 -u_turn_penalty = 20 +take_minimum_of_speeds = true +obey_oneway = true +obey_bollards = false +use_restrictions = true +ignore_areas = true -- future feature +traffic_signal_penalty = 5 +u_turn_penalty = 20 use_turn_restrictions = false -turn_penalty = 60 -turn_bias = 1.4 --- End of globals +turn_penalty = 60 +turn_bias = 1.4 + + +--modes +mode_normal = 1 +mode_pushing = 2 +mode_ferry = 3 +mode_train = 4 + + +local function parse_maxspeed(source) + if not source then + return 0 + end + local n = tonumber(source:match("%d*")) + if not n then + n = 0 + end + if string.match(source, "mph") or string.match(source, "mp/h") then + n = (n*1609)/1000; + end + return n +end + function get_exceptions(vector) - for i,v in ipairs(restriction_exception_tags) do - vector:Add(v) - end + for i,v in ipairs(restriction_exception_tags) do + vector:Add(v) + end end -function node_function (node) - local barrier = node.tags:Find ("barrier") - local access = Access.find_access_tag(node, access_tags_hierachy) - local traffic_signal = node.tags:Find("highway") - - -- flag node if it carries a traffic light - if traffic_signal == "traffic_signals" then - node.traffic_light = true +function node_function (node, result) + local barrier = node:get_value_by_key("barrier") + local access = Access.find_access_tag(node, access_tags_hierachy) + local traffic_signal = node:get_value_by_key("highway") + + -- flag node if it carries a traffic light + if traffic_signal and traffic_signal == "traffic_signals" then + result.traffic_lights = true end - + -- parse access and barrier tags if access and access ~= "" then if access_tag_blacklist[access] then - node.bollard = true + result.barrier = true else - node.bollard = false + result.barrier = false end elseif barrier and barrier ~= "" then if barrier_whitelist[barrier] then - node.bollard = false + result.barrier = false else - node.bollard = true + result.barrier = true end end - - return 1 end -function way_function (way) - -- initial routability check, filters out buildings, boundaries, etc - local highway = way.tags:Find("highway") - local route = way.tags:Find("route") - local man_made = way.tags:Find("man_made") - local railway = way.tags:Find("railway") - local amenity = way.tags:Find("amenity") - local public_transport = way.tags:Find("public_transport") - if (not highway or highway == '') and - (not route or route == '') and - (not railway or railway=='') and - (not amenity or amenity=='') and - (not man_made or man_made=='') and - (not public_transport or public_transport=='') - then - return 0 +function way_function (way, result) + -- initial routability check, filters out buildings, boundaries, etc + local highway = way:get_value_by_key("highway") + local route = way:get_value_by_key("route") + local man_made = way:get_value_by_key("man_made") + local railway = way:get_value_by_key("railway") + local amenity = way:get_value_by_key("amenity") + local public_transport = way:get_value_by_key("public_transport") + if (not highway or highway == '') and + (not route or route == '') and + (not railway or railway=='') and + (not amenity or amenity=='') and + (not man_made or man_made=='') and + (not public_transport or public_transport=='') + then + return + end + + -- don't route on ways or railways that are still under construction + if highway=='construction' or railway=='construction' then + return + end + + -- access + local access = Access.find_access_tag(way, access_tags_hierachy) + if access and access_tag_blacklist[access] then + return + end + + -- other tags + local name = way:get_value_by_key("name") + local ref = way:get_value_by_key("ref") + local junction = way:get_value_by_key("junction") + local maxspeed = parse_maxspeed(way:get_value_by_key ( "maxspeed") ) + 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 barrier = way:get_value_by_key("barrier") + local oneway = way:get_value_by_key("oneway") + local onewayClass = way:get_value_by_key("oneway:bicycle") + local cycleway = way:get_value_by_key("cycleway") + local cycleway_left = way:get_value_by_key("cycleway:left") + local cycleway_right = way:get_value_by_key("cycleway:right") + local duration = way:get_value_by_key("duration") + local service = way:get_value_by_key("service") + local area = way:get_value_by_key("area") + local foot = way:get_value_by_key("foot") + local surface = way:get_value_by_key("surface") + local bicycle = way:get_value_by_key("bicycle") + + -- name + if ref and "" ~= ref and name and "" ~= name then + result.name = name .. ' / ' .. ref + elseif ref and "" ~= ref then + result.name = ref + elseif name and "" ~= name then + result.name = name + elseif highway then + -- if no name exists, use way type + -- this encoding scheme is excepted to be a temporary solution + result.name = "{highway:"..highway.."}" + end + + -- roundabout handling + if junction and "roundabout" == junction then + result.roundabout = true; + end + + -- speed + if route_speeds[route] then + -- ferries (doesn't cover routes tagged using relations) + result.forward_mode = mode_ferry + result.backward_mode = mode_ferry + result.ignore_in_grid = true + if duration and durationIsValid(duration) then + result.duration = math.max( 1, parseDuration(duration) ) + else + result.forward_speed = route_speeds[route] + result.backward_speed = route_speeds[route] end - - -- don't route on ways or railways that are still under construction - if highway=='construction' or railway=='construction' then - return 0 + elseif railway and platform_speeds[railway] then + -- railway platforms (old tagging scheme) + result.forward_speed = platform_speeds[railway] + result.backward_speed = platform_speeds[railway] + elseif platform_speeds[public_transport] then + -- public_transport platforms (new tagging platform) + result.forward_speed = platform_speeds[public_transport] + result.backward_speed = platform_speeds[public_transport] + elseif railway and railway_speeds[railway] then + result.forward_mode = mode_train + result.backward_mode = mode_train + -- railways + if access and access_tag_whitelist[access] then + result.forward_speed = railway_speeds[railway] + result.backward_speed = railway_speeds[railway] end - - -- access - local access = Access.find_access_tag(way, access_tags_hierachy) - if access_tag_blacklist[access] then - return 0 + elseif amenity and amenity_speeds[amenity] then + -- parking areas + result.forward_speed = amenity_speeds[amenity] + result.backward_speed = amenity_speeds[amenity] + elseif bicycle_speeds[highway] then + -- regular ways + result.forward_speed = bicycle_speeds[highway] + result.backward_speed = bicycle_speeds[highway] + elseif access and access_tag_whitelist[access] then + -- unknown way, but valid access tag + result.forward_speed = default_speed + result.backward_speed = default_speed + else + -- biking not allowed, maybe we can push our bike? + -- essentially requires pedestrian profiling, for example foot=no mean we can't push a bike + if foot ~= 'no' and junction ~= "roundabout" then + if pedestrian_speeds[highway] then + -- pedestrian-only ways and areas + result.forward_speed = pedestrian_speeds[highway] + result.backward_speed = pedestrian_speeds[highway] + result.forward_mode = mode_pushing + result.backward_mode = mode_pushing + elseif man_made and man_made_speeds[man_made] then + -- man made structures + result.forward_speed = man_made_speeds[man_made] + result.backward_speed = man_made_speeds[man_made] + result.forward_mode = mode_pushing + result.backward_mode = mode_pushing + elseif foot == 'yes' then + result.forward_speed = walking_speed + result.backward_speed = walking_speed + result.forward_mode = mode_pushing + result.backward_mode = mode_pushing + elseif foot_forward == 'yes' then + result.forward_speed = walking_speed + result.forward_mode = mode_pushing + result.backward_mode = 0 + elseif foot_backward == 'yes' then + result.forward_speed = walking_speed + result.forward_mode = 0 + result.backward_mode = mode_pushing + end end + end + -- direction + local impliedOneway = false + if junction == "roundabout" or highway == "motorway_link" or highway == "motorway" then + impliedOneway = true + end - -- other tags - local name = way.tags:Find("name") - local ref = way.tags:Find("ref") - local junction = way.tags:Find("junction") - local maxspeed = parseMaxspeed(way.tags:Find ( "maxspeed") ) - local maxspeed_forward = parseMaxspeed(way.tags:Find( "maxspeed:forward")) - local maxspeed_backward = parseMaxspeed(way.tags:Find( "maxspeed:backward")) - local barrier = way.tags:Find("barrier") - local oneway = way.tags:Find("oneway") - local onewayClass = way.tags:Find("oneway:bicycle") - local cycleway = way.tags:Find("cycleway") - local cycleway_left = way.tags:Find("cycleway:left") - local cycleway_right = way.tags:Find("cycleway:right") - local duration = way.tags:Find("duration") - local service = way.tags:Find("service") - local area = way.tags:Find("area") - local foot = way.tags:Find("foot") - local surface = way.tags:Find("surface") - - -- name - if "" ~= ref and "" ~= name then - way.name = name .. ' / ' .. ref - elseif "" ~= ref then - way.name = ref - elseif "" ~= name then - way.name = name - else - way.name = "{highway:"..highway.."}" -- if no name exists, use way type - -- this encoding scheme is excepted to be a temporary solution - end - - -- speed - if route_speeds[route] then - -- ferries (doesn't cover routes tagged using relations) - way.direction = Way.bidirectional - way.ignore_in_grid = true - if durationIsValid(duration) then - way.duration = math.max( 1, parseDuration(duration) ) - else - way.speed = route_speeds[route] - end - elseif railway and platform_speeds[railway] then - -- railway platforms (old tagging scheme) - way.speed = platform_speeds[railway] - elseif platform_speeds[public_transport] then - -- public_transport platforms (new tagging platform) - way.speed = platform_speeds[public_transport] - elseif railway and railway_speeds[railway] then - -- railways - if access and access_tag_whitelist[access] then - way.speed = railway_speeds[railway] - way.direction = Way.bidirectional - end - elseif amenity and amenity_speeds[amenity] then - -- parking areas - way.speed = amenity_speeds[amenity] - elseif bicycle_speeds[highway] then - -- regular ways - way.speed = bicycle_speeds[highway] - elseif access and access_tag_whitelist[access] then - -- unknown way, but valid access tag - way.speed = default_speed - else - -- biking not allowed, maybe we can push our bike? - -- essentially requires pedestrian profiling, for example foot=no mean we can't push a bike - -- TODO: if we can push, the way should be marked as pedestrion mode, but there's no way to do it yet from lua.. - if foot ~= 'no' then - if pedestrian_speeds[highway] then - -- pedestrian-only ways and areas - way.speed = pedestrian_speeds[highway] - elseif man_made and man_made_speeds[man_made] then - -- man made structures - way.speed = man_made_speeds[man_made] - elseif foot == 'yes' then - way.speed = walking_speed - end - end + if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then + result.backward_mode = 0 + elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then + -- prevent implied oneway + elseif onewayClass == "-1" then + result.forward_mode = 0 + elseif oneway == "no" or oneway == "0" or oneway == "false" then + -- prevent implied oneway + elseif cycleway and string.find(cycleway, "opposite") == 1 then + if impliedOneway then + result.forward_mode = 0 + result.backward_mode = mode_normal + result.backward_speed = bicycle_speeds["cycleway"] end - - -- direction - way.direction = Way.bidirectional - local impliedOneway = false - if junction == "roundabout" or highway == "motorway_link" or highway == "motorway" then - way.direction = Way.oneway - impliedOneway = true - end - - if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then - way.direction = Way.oneway - elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then - way.direction = Way.bidirectional - elseif onewayClass == "-1" then - way.direction = Way.opposite - elseif oneway == "no" or oneway == "0" or oneway == "false" then - way.direction = Way.bidirectional - elseif cycleway and string.find(cycleway, "opposite") == 1 then - if impliedOneway then - way.direction = Way.opposite - else - way.direction = Way.bidirectional - end - elseif cycleway_left and cycleway_tags[cycleway_left] and cycleway_right and cycleway_tags[cycleway_right] then - way.direction = Way.bidirectional - elseif cycleway_left and cycleway_tags[cycleway_left] then - if impliedOneway then - way.direction = Way.opposite - else - way.direction = Way.bidirectional - end - elseif cycleway_right and cycleway_tags[cycleway_right] then - if impliedOneway then - way.direction = Way.oneway - else - way.direction = Way.bidirectional - end - elseif oneway == "-1" then - way.direction = Way.opposite - elseif oneway == "yes" or oneway == "1" or oneway == "true" then - way.direction = Way.oneway - end - - -- pushing bikes - if bicycle_speeds[highway] or pedestrian_speeds[highway] then - if foot ~= 'no' then - if junction ~= "roundabout" then - if way.direction == Way.oneway then - way.backward_speed = walking_speed - elseif way.direction == Way.opposite then - way.backward_speed = walking_speed - way.speed = way.speed - end - end - end - if way.backward_speed == way.speed then - -- TODO: no way yet to mark a way as pedestrian mode if forward/backward speeds are equal - way.direction = Way.bidirectional - end + elseif cycleway_left and cycleway_tags[cycleway_left] and cycleway_right and cycleway_tags[cycleway_right] then + -- prevent implied + elseif cycleway_left and cycleway_tags[cycleway_left] then + if impliedOneway then + result.forward_mode = 0 + result.backward_mode = mode_normal + result.backward_speed = bicycle_speeds["cycleway"] + end + elseif cycleway_right and cycleway_tags[cycleway_right] then + if impliedOneway then + result.forward_mode = mode_normal + result.backward_speed = bicycle_speeds["cycleway"] + result.backward_mode = 0 end + elseif oneway == "-1" then + result.forward_mode = 0 + elseif oneway == "yes" or oneway == "1" or oneway == "true" or impliedOneway then + result.backward_mode = 0 + end - - -- cycleways - if cycleway and cycleway_tags[cycleway] then - way.speed = bicycle_speeds["cycleway"] - elseif cycleway_left and cycleway_tags[cycleway_left] then - way.speed = bicycle_speeds["cycleway"] - elseif cycleway_right and cycleway_tags[cycleway_right] then - way.speed = bicycle_speeds["cycleway"] - end - - -- surfaces - if surface then - surface_speed = surface_speeds[surface] - if surface_speed then - way.speed = math.min(way.speed, surface_speed) - way.backward_speed = math.min(way.backward_speed, surface_speed) - end + -- pushing bikes + if bicycle_speeds[highway] or pedestrian_speeds[highway] then + if foot ~= "no" and junction ~= "roundabout" then + if result.backward_mode == 0 then + result.backward_speed = walking_speed + result.backward_mode = mode_pushing + elseif result.forward_mode == 0 then + result.forward_speed = walking_speed + result.forward_mode = mode_pushing + end end + end - -- maxspeed - -- TODO: maxspeed of backward direction - if take_minimum_of_speeds then - if maxspeed and maxspeed>0 then - way.speed = math.min(way.speed, maxspeed) - end - end + -- cycleways + if cycleway and cycleway_tags[cycleway] then + result.forward_speed = bicycle_speeds["cycleway"] + elseif cycleway_left and cycleway_tags[cycleway_left] then + result.forward_speed = bicycle_speeds["cycleway"] + elseif cycleway_right and cycleway_tags[cycleway_right] then + result.forward_speed = bicycle_speeds["cycleway"] + end - -- Override speed settings if explicit forward/backward maxspeeds are given - if maxspeed_forward ~= nil and maxspeed_forward > 0 then - if Way.bidirectional == way.direction then - way.backward_speed = way.speed - end - way.speed = maxspeed_forward - end - if maxspeed_backward ~= nil and maxspeed_backward > 0 then - way.backward_speed = maxspeed_backward - end + -- dismount + if bicycle == "dismount" then + result.forward_mode = mode_pushing + result.backward_mode = mode_pushing + result.forward_speed = walking_speed + result.backward_speed = walking_speed + end + -- surfaces + if surface then + surface_speed = surface_speeds[surface] + if surface_speed then + if result.forward_speed > 0 then + result.forward_speed = surface_speed + end + if result.backward_speed > 0 then + result.backward_speed = surface_speed + end + end + end - - way.type = 1 - return 1 + -- maxspeed + MaxSpeed.limit( result, maxspeed, maxspeed_forward, maxspeed_backward ) end function turn_function (angle) - -- compute turn penalty as angle^2, with a left/right bias - k = turn_penalty/(90.0*90.0) - if angle>=0 then - return angle*angle*k/turn_bias - else - return angle*angle*k*turn_bias - end + -- compute turn penalty as angle^2, with a left/right bias + k = turn_penalty/(90.0*90.0) + if angle>=0 then + return angle*angle*k/turn_bias + else + return angle*angle*k*turn_bias + end end diff --git a/debian/conffiles/car.lua b/debian/conffiles/car.lua index ff7c379..cd1f06b 100644 --- a/debian/conffiles/car.lua +++ b/debian/conffiles/car.lua @@ -1,9 +1,9 @@ -- Begin of globals -require("lib/access") +--require("lib/access") --function temporarily inlined -barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true} -access_tag_whitelist = { ["yes"] = true, ["motorcar"] = true, ["motor_vehicle"] = true, ["vehicle"] = true, ["permissive"] = true, ["designated"] = true } -access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true } +barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["checkpoint"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true, ["entrance"] = true } +access_tag_whitelist = { ["yes"] = true, ["motorcar"] = true, ["motor_vehicle"] = true, ["vehicle"] = true, ["permissive"] = true, ["designated"] = true } +access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true, ["emergency"] = true } access_tag_restricted = { ["destination"] = true, ["delivery"] = true } access_tags = { "motorcar", "motor_vehicle", "vehicle" } access_tags_hierachy = { "motorcar", "motor_vehicle", "vehicle", "access" } @@ -13,15 +13,15 @@ restriction_exception_tags = { "motorcar", "motor_vehicle", "vehicle" } speed_profile = { ["motorway"] = 90, - ["motorway_link"] = 75, + ["motorway_link"] = 45, ["trunk"] = 85, - ["trunk_link"] = 70, + ["trunk_link"] = 40, ["primary"] = 65, - ["primary_link"] = 60, + ["primary_link"] = 30, ["secondary"] = 55, - ["secondary_link"] = 50, + ["secondary_link"] = 25, ["tertiary"] = 40, - ["tertiary_link"] = 30, + ["tertiary_link"] = 20, ["unclassified"] = 25, ["residential"] = 25, ["living_street"] = 10, @@ -29,191 +29,374 @@ speed_profile = { -- ["track"] = 5, ["ferry"] = 5, ["shuttle_train"] = 10, - ["default"] = 50 + ["default"] = 10 } -take_minimum_of_speeds = false -obey_oneway = true -obey_bollards = true -use_restrictions = true -ignore_areas = true -- future feature -traffic_signal_penalty = 2 -u_turn_penalty = 20 --- End of globals +-- surface/trackype/smoothness +-- values were estimated from looking at the photos at the relevant wiki pages + +-- max speed for surfaces +surface_speeds = { + ["asphalt"] = nil, -- nil mean no limit. removing the line has the same effect + ["concrete"] = nil, + ["concrete:plates"] = nil, + ["concrete:lanes"] = nil, + ["paved"] = nil, + + ["cement"] = 80, + ["compacted"] = 80, + ["fine_gravel"] = 80, + + ["paving_stones"] = 60, + ["metal"] = 60, + ["bricks"] = 60, + + ["grass"] = 40, + ["wood"] = 40, + ["sett"] = 40, + ["grass_paver"] = 40, + ["gravel"] = 40, + ["unpaved"] = 40, + ["ground"] = 40, + ["dirt"] = 40, + ["pebblestone"] = 40, + ["tartan"] = 40, + + ["cobblestone"] = 30, + ["clay"] = 30, + + ["earth"] = 20, + ["stone"] = 20, + ["rocky"] = 20, + ["sand"] = 20, + + ["mud"] = 10 +} + +-- max speed for tracktypes +tracktype_speeds = { + ["grade1"] = 60, + ["grade2"] = 40, + ["grade3"] = 30, + ["grade4"] = 25, + ["grade5"] = 20 +} + +-- max speed for smoothnesses +smoothness_speeds = { + ["intermediate"] = 80, + ["bad"] = 40, + ["very_bad"] = 20, + ["horrible"] = 10, + ["very_horrible"] = 5, + ["impassable"] = 0 +} + +-- http://wiki.openstreetmap.org/wiki/Speed_limits +maxspeed_table_default = { + ["urban"] = 50, + ["rural"] = 90, + ["trunk"] = 110, + ["motorway"] = 130 +} + +-- List only exceptions +maxspeed_table = { + ["ch:rural"] = 80, + ["ch:trunk"] = 100, + ["ch:motorway"] = 120, + ["de:living_street"] = 7, + ["ru:living_street"] = 20, + ["ru:urban"] = 60, + ["ua:urban"] = 60, + ["at:rural"] = 100, + ["de:rural"] = 100, + ["at:trunk"] = 100, + ["cz:trunk"] = 0, + ["ro:trunk"] = 100, + ["cz:motorway"] = 0, + ["de:motorway"] = 0, + ["ru:motorway"] = 110, + ["gb:nsl_single"] = (60*1609)/1000, + ["gb:nsl_dual"] = (70*1609)/1000, + ["gb:motorway"] = (70*1609)/1000, + ["uk:nsl_single"] = (60*1609)/1000, + ["uk:nsl_dual"] = (70*1609)/1000, + ["uk:motorway"] = (70*1609)/1000 +} + +traffic_signal_penalty = 2 +use_turn_restrictions = true + +local take_minimum_of_speeds = false +local obey_oneway = true +local obey_bollards = true +local ignore_areas = true -- future feature +local u_turn_penalty = 20 + +local abs = math.abs +local min = math.min +local max = math.max + +local speed_reduction = 0.8 + +--modes +local mode_normal = 1 +local mode_ferry = 2 + +local function find_access_tag(source, access_tags_hierachy) + for i,v in ipairs(access_tags_hierachy) do + local access_tag = source:get_value_by_key(v) + if access_tag and "" ~= access_tag then + return access_tag + end + end + return "" +end function get_exceptions(vector) - for i,v in ipairs(restriction_exception_tags) do - vector:Add(v) - end + for i,v in ipairs(restriction_exception_tags) do + vector:Add(v) + end end local function parse_maxspeed(source) - if source == nil then - return 0 - end - local n = tonumber(source:match("%d*")) - if n == nil then - n = 0 - end - if string.match(source, "mph") or string.match(source, "mp/h") then - n = (n*1609)/1000; - end - return math.abs(n) + if not source then + return 0 + end + local n = tonumber(source:match("%d*")) + if n then + if string.match(source, "mph") or string.match(source, "mp/h") then + n = (n*1609)/1000; + end + else + -- parse maxspeed like FR:urban + source = string.lower(source) + n = maxspeed_table[source] + if not n then + local highway_type = string.match(source, "%a%a:(%a+)") + n = maxspeed_table_default[highway_type] + if not n then + n = 0 + end + end + end + return n end -function node_function (node) - local barrier = node.tags:Find ("barrier") - local access = Access.find_access_tag(node, access_tags_hierachy) - local traffic_signal = node.tags:Find("highway") - - --flag node if it carries a traffic light - - if traffic_signal == "traffic_signals" then - node.traffic_light = true; - end - - -- parse access and barrier tags - if access and access ~= "" then - if access_tag_blacklist[access] then - node.bollard = true - end - elseif barrier and barrier ~= "" then - if barrier_whitelist[barrier] then - return - else - node.bollard = true - end - end - return 1 +-- function turn_function (angle) +-- -- print ("called at angle " .. angle ) +-- local index = math.abs(math.floor(angle/10+0.5))+1 -- +1 'coz LUA starts as idx 1 +-- local penalty = turn_cost_table[index] +-- -- print ("index: " .. index .. ", bias: " .. penalty ) +-- return penalty +-- end + +function node_function (node, result) + -- parse access and barrier tags + local access = find_access_tag(node, access_tags_hierachy) + if access ~= "" then + if access_tag_blacklist[access] then + result.barrier = true + end + else + local barrier = node:get_value_by_key("barrier") + if barrier and "" ~= barrier then + if barrier_whitelist[barrier] then + return + else + result.barrier = true + end + end + end + + -- check if node is a traffic light + local tag = node:get_value_by_key("highway") + if tag and "traffic_signals" == tag then + result.traffic_lights = true; + end end +function way_function (way, result) + local highway = way:get_value_by_key("highway") + local route = way:get_value_by_key("route") + + if not ((highway and highway ~= "") or (route and route ~= "")) then + return + end -function way_function (way) -- we dont route over areas - local area = way.tags:Find("area") - if ignore_areas and ("yes" == area) then - return 0 + local area = way:get_value_by_key("area") + if ignore_areas and area and "yes" == area then + return end -- check if oneway tag is unsupported - local oneway = way.tags:Find("oneway") - if "reversible" == oneway then - return 0 + local oneway = way:get_value_by_key("oneway") + if oneway and "reversible" == oneway then + return end - -- Check if we are allowed to access the way - local access = Access.find_access_tag(way, access_tags_hierachy) - if access_tag_blacklist[access] then - return 0 + local impassable = way:get_value_by_key("impassable") + if impassable and "yes" == impassable then + return end - -- Second, parse the way according to these properties - local highway = way.tags:Find("highway") - local name = way.tags:Find("name") - local ref = way.tags:Find("ref") - local junction = way.tags:Find("junction") - local route = way.tags:Find("route") - local maxspeed = parse_maxspeed(way.tags:Find ( "maxspeed") ) - local maxspeed_forward = parse_maxspeed(way.tags:Find( "maxspeed:forward")) - local maxspeed_backward = parse_maxspeed(way.tags:Find( "maxspeed:backward")) - local barrier = way.tags:Find("barrier") - local cycleway = way.tags:Find("cycleway") - local duration = way.tags:Find("duration") - local service = way.tags:Find("service") - + local status = way:get_value_by_key("status") + if status and "impassable" == status then + return + end - -- Set the name that will be used for instructions - if "" ~= ref then - way.name = ref - elseif "" ~= name then - way.name = name --- else --- way.name = highway -- if no name exists, use way type - end - - if "roundabout" == junction then - way.roundabout = true; - 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 + return + end -- Handling ferries and piers - if (speed_profile[route] ~= nil and speed_profile[route] > 0) then - if durationIsValid(duration) then - way.duration = math.max( parseDuration(duration), 1 ); - end - way.direction = Way.bidirectional - if speed_profile[route] ~= nil then - highway = route; - end - if tonumber(way.duration) < 0 then - way.speed = speed_profile[highway] + local route_speed = speed_profile[route] + if(route_speed and route_speed > 0) then + highway = route; + local duration = way:get_value_by_key("duration") + if duration and durationIsValid(duration) then + result.duration = max( parseDuration(duration), 1 ); end + result.forward_mode = mode_ferry + result.backward_mode = mode_ferry + result.forward_speed = route_speed + result.backward_speed = route_speed + end + + -- leave early of this way is not accessible + if "" == highway then + return end - -- Set the avg speed on the way if it is accessible by road class - if (speed_profile[highway] ~= nil and way.speed == -1 ) then - if maxspeed > speed_profile[highway] then - way.speed = maxspeed + if result.forward_speed == -1 then + local highway_speed = speed_profile[highway] + local max_speed = parse_maxspeed( way:get_value_by_key("maxspeed") ) + -- Set the avg speed on the way if it is accessible by road class + if highway_speed then + if max_speed and max_speed > highway_speed then + result.forward_speed = max_speed + result.backward_speed = max_speed + -- max_speed = math.huge + else + result.forward_speed = highway_speed + result.backward_speed = highway_speed + end else - if 0 == maxspeed then - maxspeed = math.huge + -- Set the avg speed on ways that are marked accessible + if access_tag_whitelist[access] then + result.forward_speed = speed_profile["default"] + result.backward_speed = speed_profile["default"] end - way.speed = math.min(speed_profile[highway], maxspeed) end + if 0 == max_speed then + max_speed = math.huge + end + result.forward_speed = min(result.forward_speed, max_speed) + result.backward_speed = min(result.backward_speed, max_speed) end - -- Set the avg speed on ways that are marked accessible - if "" ~= highway and access_tag_whitelist[access] and way.speed == -1 then - if 0 == maxspeed then - maxspeed = math.huge - end - way.speed = math.min(speed_profile["default"], maxspeed) + if -1 == result.forward_speed and -1 == result.backward_speed then + return + end + + -- reduce speed on bad surfaces + local surface = way:get_value_by_key("surface") + local tracktype = way:get_value_by_key("tracktype") + local smoothness = way:get_value_by_key("smoothness") + + if surface and surface_speeds[surface] then + result.forward_speed = math.min(surface_speeds[surface], result.forward_speed) + result.backward_speed = math.min(surface_speeds[surface], result.backward_speed) + end + if tracktype and tracktype_speeds[tracktype] then + result.forward_speed = math.min(tracktype_speeds[tracktype], result.forward_speed) + result.backward_speed = math.min(tracktype_speeds[tracktype], result.backward_speed) + end + if smoothness and smoothness_speeds[smoothness] then + result.forward_speed = math.min(smoothness_speeds[smoothness], result.forward_speed) + result.backward_speed = math.min(smoothness_speeds[smoothness], result.backward_speed) + end + + -- parse the remaining tags + local name = way:get_value_by_key("name") + local ref = way:get_value_by_key("ref") + local junction = way:get_value_by_key("junction") + -- local barrier = way:get_value_by_key("barrier", "") + -- local cycleway = way:get_value_by_key("cycleway", "") + local service = way:get_value_by_key("service") + + -- Set the name that will be used for instructions + if ref and "" ~= ref then + result.name = ref + elseif name and "" ~= name then + result.name = name +-- else + -- result.name = highway -- if no name exists, use way type + end + + if junction and "roundabout" == junction then + result.roundabout = true; end -- Set access restriction flag if access is allowed under certain restrictions only if access ~= "" and access_tag_restricted[access] then - way.is_access_restricted = true + result.is_access_restricted = true end -- Set access restriction flag if service is allowed under certain restrictions only - if service ~= "" and service_tag_restricted[service] then - way.is_access_restricted = true + if service and service ~= "" and service_tag_restricted[service] then + result.is_access_restricted = true end -- Set direction according to tags on way - way.direction = Way.bidirectional if obey_oneway then - if oneway == "-1" then - way.direction = Way.opposite - elseif oneway == "yes" or oneway == "1" or oneway == "true" or junction == "roundabout" or highway == "motorway_link" or highway == "motorway" then - way.direction = Way.oneway + if oneway == "-1" then + result.forward_mode = 0 + elseif oneway == "yes" or + oneway == "1" or + oneway == "true" or + junction == "roundabout" or + (highway == "motorway_link" and oneway ~="no") or + (highway == "motorway" and oneway ~= "no") then + result.backward_mode = 0 end end -- Override speed settings if explicit forward/backward maxspeeds are given - if maxspeed_forward ~= nil and maxspeed_forward > 0 then - if Way.bidirectional == way.direction then - way.backward_speed = way.speed + 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 end - way.speed = maxspeed_forward + result.forward_speed = maxspeed_forward end - if maxspeed_backward ~= nil and maxspeed_backward > 0 then - way.backward_speed = maxspeed_backward + if maxspeed_backward and maxspeed_backward > 0 then + result.backward_speed = maxspeed_backward end -- Override general direction settings of there is a specific one for our mode of travel - if ignore_in_grid[highway] ~= nil and ignore_in_grid[highway] then - way.ignore_in_grid = true - end + if ignore_in_grid[highway] then + result.ignore_in_grid = true + end - way.type = 1 - return 1 + -- scale speeds to get better avg driving times + if result.forward_speed > 0 then + result.forward_speed = result.forward_speed*speed_reduction + 11; + end + if result.backward_speed > 0 then + result.backward_speed = result.backward_speed*speed_reduction + 11; + end end -- These are wrappers to parse vectors of nodes and ways and thus to speed up any tracing JIT - function node_vector_function(vector) - for v in vector.nodes do - node_function(v) - end + for v in vector.nodes do + node_function(v) + end end diff --git a/debian/conffiles/foot.lua b/debian/conffiles/foot.lua index 6a15fb2..5a37097 100644 --- a/debian/conffiles/foot.lua +++ b/debian/conffiles/foot.lua @@ -1,193 +1,211 @@ -- Foot profile --- Begin of globals +require("lib/access") -bollards_whitelist = { [""] = true, ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true} +barrier_whitelist = { [""] = true, ["cycle_barrier"] = true, ["bollard"] = true, ["entrance"] = true, ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true} access_tag_whitelist = { ["yes"] = true, ["foot"] = true, ["permissive"] = true, ["designated"] = true } access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestery"] = true } access_tag_restricted = { ["destination"] = true, ["delivery"] = true } -access_tags = { "foot" } +access_tags_hierachy = { "foot", "access" } service_tag_restricted = { ["parking_aisle"] = true } ignore_in_grid = { ["ferry"] = true } restriction_exception_tags = { "foot" } -speed_profile = { - ["primary"] = 5, - ["primary_link"] = 5, - ["secondary"] = 5, - ["secondary_link"] = 5, - ["tertiary"] = 5, - ["tertiary_link"] = 5, - ["unclassified"] = 5, - ["residential"] = 5, - ["road"] = 5, - ["living_street"] = 5, - ["service"] = 5, - ["track"] = 5, - ["path"] = 5, - ["steps"] = 5, - ["ferry"] = 5, - ["pedestrian"] = 5, - ["footway"] = 5, - ["pier"] = 5, - ["default"] = 5 +walking_speed = 5 + +speeds = { + ["primary"] = walking_speed, + ["primary_link"] = walking_speed, + ["secondary"] = walking_speed, + ["secondary_link"] = walking_speed, + ["tertiary"] = walking_speed, + ["tertiary_link"] = walking_speed, + ["unclassified"] = walking_speed, + ["residential"] = walking_speed, + ["road"] = walking_speed, + ["living_street"] = walking_speed, + ["service"] = walking_speed, + ["track"] = walking_speed, + ["path"] = walking_speed, + ["steps"] = walking_speed, + ["pedestrian"] = walking_speed, + ["footway"] = walking_speed, + ["pier"] = walking_speed, + ["default"] = walking_speed } +route_speeds = { + ["ferry"] = 5 +} + +platform_speeds = { + ["platform"] = walking_speed +} + +amenity_speeds = { + ["parking"] = walking_speed, + ["parking_entrance"] = walking_speed +} + +man_made_speeds = { + ["pier"] = walking_speed +} + +surface_speeds = { + ["fine_gravel"] = walking_speed*0.75, + ["gravel"] = walking_speed*0.75, + ["pebbelstone"] = walking_speed*0.75, + ["mud"] = walking_speed*0.5, + ["sand"] = walking_speed*0.5 +} -take_minimum_of_speeds = true -obey_oneway = true -obey_bollards = false -use_restrictions = false -ignore_areas = true -- future feature traffic_signal_penalty = 2 u_turn_penalty = 2 use_turn_restrictions = false --- End of globals + +--modes +local mode_normal = 1 +local mode_ferry = 2 function get_exceptions(vector) - for i,v in ipairs(restriction_exception_tags) do + for i,v in ipairs(restriction_exception_tags) do vector:Add(v) end end -function node_function (node) - local barrier = node.tags:Find ("barrier") - local access = node.tags:Find ("access") - local traffic_signal = node.tags:Find("highway") - - --flag node if it carries a traffic light - - if traffic_signal == "traffic_signals" then - node.traffic_light = true; - end - - if obey_bollards then - --flag node as unpassable if it black listed as unpassable - if access_tag_blacklist[barrier] then - node.bollard = true; - end - - --reverse the previous flag if there is an access tag specifying entrance - if node.bollard and not bollards_whitelist[barrier] and not access_tag_whitelist[barrier] then - node.bollard = false; - end - end - return 1 -end +function node_function (node, result) + local barrier = node:get_value_by_key("barrier") + local access = Access.find_access_tag(node, access_tags_hierachy) + local traffic_signal = node:get_value_by_key("highway") + + -- flag node if it carries a traffic light + if traffic_signal and traffic_signal == "traffic_signals" then + result.traffic_light = true + end -function way_function (way) - - -- First, get the properties of each way that we come across - local highway = way.tags:Find("highway") - local name = way.tags:Find("name") - local ref = way.tags:Find("ref") - local junction = way.tags:Find("junction") - local route = way.tags:Find("route") - local maxspeed = parseMaxspeed(way.tags:Find ( "maxspeed") ) - local man_made = way.tags:Find("man_made") - local barrier = way.tags:Find("barrier") - local oneway = way.tags:Find("oneway") - local onewayClass = way.tags:Find("oneway:foot") - local duration = way.tags:Find("duration") - local service = way.tags:Find("service") - local area = way.tags:Find("area") - local access = way.tags:Find("access") - - -- Second parse the way according to these properties - - if ignore_areas and ("yes" == area) then - return 0 + -- parse access and barrier tags + if access and access ~= "" then + if access_tag_blacklist[access] then + result.barrier = true + else + result.barrier = false + end + elseif barrier and barrier ~= "" then + if barrier_whitelist[barrier] then + result.barrier = false + else + result.barrier = true + end end - - -- Check if we are allowed to access the way - if access_tag_blacklist[access] ~=nil and access_tag_blacklist[access] then - return 0; + + return 1 +end + +function way_function (way, result) + -- initial routability check, filters out buildings, boundaries, etc + local highway = way:get_value_by_key("highway") + local route = way:get_value_by_key("route") + local man_made = way:get_value_by_key("man_made") + local railway = way:get_value_by_key("railway") + local amenity = way:get_value_by_key("amenity") + local public_transport = way:get_value_by_key("public_transport") + if (not highway or highway == '') and + (not route or route == '') and + (not railway or railway=='') and + (not amenity or amenity=='') and + (not man_made or man_made=='') and + (not public_transport or public_transport=='') + then + return end - - -- Check if our vehicle types are forbidden - for i,v in ipairs(access_tags) do - local mode_value = way.tags:Find(v) - if nil ~= mode_value and "no" == mode_value then - return 0; - end + + -- don't route on ways that are still under construction + if highway=='construction' then + return end - - - -- Set the name that will be used for instructions - if "" ~= ref then - way.name = ref - elseif "" ~= name then - way.name = name + + -- access + local access = Access.find_access_tag(way, access_tags_hierachy) + if access_tag_blacklist[access] then + return + end + + local name = way:get_value_by_key("name") + local ref = way:get_value_by_key("ref") + local junction = way:get_value_by_key("junction") + local onewayClass = way:get_value_by_key("oneway:foot") + local duration = way:get_value_by_key("duration") + local service = way:get_value_by_key("service") + local area = way:get_value_by_key("area") + local foot = way:get_value_by_key("foot") + local surface = way:get_value_by_key("surface") + + -- name + if ref and "" ~= ref and name and "" ~= name then + result.name = name .. ' / ' .. ref + elseif ref and "" ~= ref then + result.name = ref + elseif name and "" ~= name then + result.name = name + elseif highway then + result.name = "{highway:"..highway.."}" -- if no name exists, use way type + -- this encoding scheme is excepted to be a temporary solution end - + + -- roundabouts if "roundabout" == junction then - way.roundabout = true; + result.roundabout = true; end - -- Handling ferries and piers - - if (speed_profile[route] ~= nil and speed_profile[route] > 0) or - (speed_profile[man_made] ~= nil and speed_profile[man_made] > 0) - then - if durationIsValid(duration) then - way.speed = parseDuration(duration) / math.max(1, numberOfNodesInWay-1); - way.is_duration_set = true; - end - way.direction = Way.bidirectional; - if speed_profile[route] ~= nil then - highway = route; - elseif speed_profile[man_made] ~= nil then - highway = man_made; - end - if not way.is_duration_set then - way.speed = speed_profile[highway] - end - - end - - -- Set the avg speed on the way if it is accessible by road class - if (speed_profile[highway] ~= nil and way.speed == -1 ) then - way.speed = speed_profile[highway] - end - - -- Set the avg speed on ways that are marked accessible - if access_tag_whitelist[access] and way.speed == -1 then - if (0 < maxspeed and not take_minimum_of_speeds) or maxspeed == 0 then - maxspeed = math.huge - end - way.speed = math.min(speed_profile["default"], maxspeed) + -- speed + if route_speeds[route] then + -- ferries (doesn't cover routes tagged using relations) + result.ignore_in_grid = true + if duration and durationIsValid(duration) then + result.duration = math.max( 1, parseDuration(duration) ) + else + result.forward_speed = route_speeds[route] + result.backward_speed = route_speeds[route] + end + result.forward_mode = mode_ferry + result.backward_mode = mode_ferry + elseif railway and platform_speeds[railway] then + -- railway platforms (old tagging scheme) + result.forward_speed = platform_speeds[railway] + result.backward_speed = platform_speeds[railway] + elseif platform_speeds[public_transport] then + -- public_transport platforms (new tagging platform) + result.forward_speed = platform_speeds[public_transport] + result.backward_speed = platform_speeds[public_transport] + elseif amenity and amenity_speeds[amenity] then + -- parking areas + result.forward_speed = amenity_speeds[amenity] + result.backward_speed = amenity_speeds[amenity] + elseif speeds[highway] then + -- regular ways + result.forward_speed = speeds[highway] + result.backward_speed = speeds[highway] + elseif access and access_tag_whitelist[access] then + -- unknown way, but valid access tag + result.forward_speed = walking_speed + result.backward_speed = walking_speed end - -- Set access restriction flag if access is allowed under certain restrictions only - if access ~= "" and access_tag_restricted[access] then - way.is_access_restricted = true + -- oneway + if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then + result.backward_mode = 0 + elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then + -- nothing to do + elseif onewayClass == "-1" then + result.forward_mode = 0 end - -- Set access restriction flag if service is allowed under certain restrictions only - if service ~= "" and service_tag_restricted[service] then - way.is_access_restricted = true - end - - -- Set direction according to tags on way - if obey_oneway then - if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then - way.direction = Way.oneway - elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then - way.direction = Way.bidirectional - elseif onewayClass == "-1" then - way.direction = Way.opposite - else - way.direction = Way.bidirectional - end - else - way.direction = Way.bidirectional + -- surfaces + if surface then + surface_speed = surface_speeds[surface] + if surface_speed then + result.forward_speed = math.min(result.forward_speed, surface_speed) + result.backward_speed = math.min(result.backward_speed, surface_speed) + end end - - -- Override general direction settings of there is a specific one for our mode of travel - - if ignore_in_grid[highway] ~= nil and ignore_in_grid[highway] then - way.ignore_in_grid = true - end - way.type = 1 - return 1 end diff --git a/debian/conffiles/maxspeed.lua b/debian/conffiles/maxspeed.lua new file mode 100644 index 0000000..aca344a --- /dev/null +++ b/debian/conffiles/maxspeed.lua @@ -0,0 +1,17 @@ +local math = math + +module "MaxSpeed" + +function limit(way,max,maxf,maxb) + if maxf and maxf>0 then + way.forward_speed = math.min(way.forward_speed, maxf) + elseif max and max>0 then + way.forward_speed = math.min(way.forward_speed, max) + end + + if maxb and maxb>0 then + way.backward_speed = math.min(way.backward_speed, maxb) + elseif max and max>0 then + way.backward_speed = math.min(way.backward_speed, max) + end +end diff --git a/debian/conffiles/testbot.lua b/debian/conffiles/testbot.lua index f934fea..7bd1416 100644 --- a/debian/conffiles/testbot.lua +++ b/debian/conffiles/testbot.lua @@ -2,106 +2,121 @@ -- Moves at fixed, well-known speeds, practical for testing speed and travel times: --- Primary road: 36km/h = 36000m/3600s = 100m/10s --- Secondary road: 18km/h = 18000m/3600s = 100m/20s --- Tertiary road: 12km/h = 12000m/3600s = 100m/30s - -speed_profile = { - ["primary"] = 36, - ["secondary"] = 18, - ["tertiary"] = 12, - ["default"] = 24 +-- Primary road: 36km/h = 36000m/3600s = 100m/10s +-- Secondary road: 18km/h = 18000m/3600s = 100m/20s +-- Tertiary road: 12km/h = 12000m/3600s = 100m/30s + +-- modes: +-- 1: normal +-- 2: route +-- 3: river downstream +-- 4: river upstream +-- 5: steps down +-- 6: steps up + +speed_profile = { + ["primary"] = 36, + ["secondary"] = 18, + ["tertiary"] = 12, + ["steps"] = 6, + ["default"] = 24 } -- these settings are read directly by osrm -take_minimum_of_speeds = true -obey_oneway = true -obey_bollards = true -use_restrictions = true -ignore_areas = true -- future feature -traffic_signal_penalty = 7 -- seconds -u_turn_penalty = 20 +take_minimum_of_speeds = true +obey_oneway = true +obey_barriers = true +use_turn_restrictions = true +ignore_areas = true -- future feature +traffic_signal_penalty = 7 -- seconds +u_turn_penalty = 20 function limit_speed(speed, limits) - -- don't use ipairs(), since it stops at the first nil value - for i=1, #limits do - limit = limits[i] - if limit ~= nil and limit > 0 then - if limit < speed then - return limit -- stop at first speedlimit that's smaller than speed - end - end + -- don't use ipairs(), since it stops at the first nil value + for i=1, #limits do + limit = limits[i] + if limit ~= nil and limit > 0 then + if limit < speed then + return limit -- stop at first speedlimit that's smaller than speed + end end - return speed + end + return speed end -function node_function (node) - local traffic_signal = node.tags:Find("highway") +function node_function (node, result) + local traffic_signal = node:get_value_by_key("highway") - if traffic_signal == "traffic_signals" then - node.traffic_light = true; - -- TODO: a way to set the penalty value - end - return 1 + if traffic_signal and traffic_signal == "traffic_signals" then + result.traffic_lights = true; + -- TODO: a way to set the penalty value + end end -function way_function (way) - local highway = way.tags:Find("highway") - local name = way.tags:Find("name") - local oneway = way.tags:Find("oneway") - local route = way.tags:Find("route") - local duration = way.tags:Find("duration") - local maxspeed = tonumber(way.tags:Find ( "maxspeed")) - local maxspeed_forward = tonumber(way.tags:Find( "maxspeed:forward")) - local maxspeed_backward = tonumber(way.tags:Find( "maxspeed:backward")) - - way.name = name - - if route ~= nil and durationIsValid(duration) then - way.duration = math.max( 1, parseDuration(duration) ) - else - local speed_forw = speed_profile[highway] or speed_profile['default'] - local speed_back = speed_forw - - if highway == "river" then - local temp_speed = speed_forw; - speed_forw = temp_speed*1.5 - speed_back = temp_speed/1.5 - end - - if maxspeed_forward ~= nil and maxspeed_forward > 0 then - speed_forw = maxspeed_forward - else - if maxspeed ~= nil and maxspeed > 0 and speed_forw > maxspeed then - speed_forw = maxspeed - end - end - - if maxspeed_backward ~= nil and maxspeed_backward > 0 then - speed_back = maxspeed_backward - else - if maxspeed ~=nil and maxspeed > 0 and speed_back > maxspeed then - speed_back = maxspeed - end - end - - way.speed = speed_forw - if speed_back ~= way_forw then - way.backward_speed = speed_back - end - end - - if oneway == "no" or oneway == "0" or oneway == "false" then - way.direction = Way.bidirectional - elseif oneway == "-1" then - way.direction = Way.opposite - elseif oneway == "yes" or oneway == "1" or oneway == "true" then - way.direction = Way.oneway - else - way.direction = Way.bidirectional - end - - way.type = 1 - return 1 +function way_function (way, result) + local highway = way:get_value_by_key("highway") + local name = way:get_value_by_key("name") + local oneway = way:get_value_by_key("oneway") + local route = way:get_value_by_key("route") + local duration = way:get_value_by_key("duration") + local maxspeed = tonumber(way:get_value_by_key ( "maxspeed")) + local maxspeed_forward = tonumber(way:get_value_by_key( "maxspeed:forward")) + local maxspeed_backward = tonumber(way:get_value_by_key( "maxspeed:backward")) + local junction = way:get_value_by_key("junction") + + if name then + result.name = name + end + + if duration and durationIsValid(duration) then + result.duration = math.max( 1, parseDuration(duration) ) + result.forward_mode = 2 + result.backward_mode = 2 + else + local speed_forw = speed_profile[highway] or speed_profile['default'] + local speed_back = speed_forw + + if highway == "river" then + local temp_speed = speed_forw; + result.forward_mode = 3 + result.backward_mode = 4 + speed_forw = temp_speed*1.5 + speed_back = temp_speed/1.5 + elseif highway == "steps" then + result.forward_mode = 5 + result.backward_mode = 6 + end + + if maxspeed_forward ~= nil and maxspeed_forward > 0 then + speed_forw = maxspeed_forward + else + if maxspeed ~= nil and maxspeed > 0 and speed_forw > maxspeed then + speed_forw = maxspeed + end + end + + if maxspeed_backward ~= nil and maxspeed_backward > 0 then + speed_back = maxspeed_backward + else + if maxspeed ~=nil and maxspeed > 0 and speed_back > maxspeed then + speed_back = maxspeed + end + end + + result.forward_speed = speed_forw + result.backward_speed = speed_back + end + + if oneway == "no" or oneway == "0" or oneway == "false" then + -- nothing to do + elseif oneway == "-1" then + result.forward_mode = 0 + elseif oneway == "yes" or oneway == "1" or oneway == "true" or junction == "roundabout" then + result.backward_mode = 0 + end + + if junction == 'roundabout' then + result.roundabout = true + end end -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osrm.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel