Merge pull request #973 from DennisOSRM/fix/clean_profile_indentation

cleanup indentation of lua profiles
This commit is contained in:
Dennis Luxen 2014-04-01 17:07:39 +02:00
commit 05c33bee78
3 changed files with 425 additions and 428 deletions

View File

@ -1,8 +1,8 @@
require("lib/access") require("lib/access")
-- Begin of globals -- 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} 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_whitelist = { ["yes"] = true, ["permissive"] = true, ["designated"] = true }
access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestery"] = true } access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestery"] = true }
access_tag_restricted = { ["destination"] = true, ["delivery"] = true } access_tag_restricted = { ["destination"] = true, ["delivery"] = true }
access_tags_hierachy = { "bicycle", "vehicle", "access" } access_tags_hierachy = { "bicycle", "vehicle", "access" }
@ -15,349 +15,348 @@ default_speed = 15
walking_speed = 6 walking_speed = 6
bicycle_speeds = { bicycle_speeds = {
["cycleway"] = default_speed, ["cycleway"] = default_speed,
["primary"] = default_speed, ["primary"] = default_speed,
["primary_link"] = default_speed, ["primary_link"] = default_speed,
["secondary"] = default_speed, ["secondary"] = default_speed,
["secondary_link"] = default_speed, ["secondary_link"] = default_speed,
["tertiary"] = default_speed, ["tertiary"] = default_speed,
["tertiary_link"] = default_speed, ["tertiary_link"] = default_speed,
["residential"] = default_speed, ["residential"] = default_speed,
["unclassified"] = default_speed, ["unclassified"] = default_speed,
["living_street"] = default_speed, ["living_street"] = default_speed,
["road"] = default_speed, ["road"] = default_speed,
["service"] = default_speed, ["service"] = default_speed,
["track"] = 12, ["track"] = 12,
["path"] = 12 ["path"] = 12
--["footway"] = 12, --["footway"] = 12,
--["pedestrian"] = 12, --["pedestrian"] = 12,
} }
pedestrian_speeds = { pedestrian_speeds = {
["footway"] = walking_speed, ["footway"] = walking_speed,
["pedestrian"] = walking_speed, ["pedestrian"] = walking_speed,
["steps"] = 2 ["steps"] = 2
} }
railway_speeds = { railway_speeds = {
["train"] = 10, ["train"] = 10,
["railway"] = 10, ["railway"] = 10,
["subway"] = 10, ["subway"] = 10,
["light_rail"] = 10, ["light_rail"] = 10,
["monorail"] = 10, ["monorail"] = 10,
["tram"] = 10 ["tram"] = 10
} }
platform_speeds = { platform_speeds = {
["platform"] = walking_speed ["platform"] = walking_speed
} }
amenity_speeds = { amenity_speeds = {
["parking"] = 10, ["parking"] = 10,
["parking_entrance"] = 10 ["parking_entrance"] = 10
} }
man_made_speeds = { man_made_speeds = {
["pier"] = walking_speed ["pier"] = walking_speed
} }
route_speeds = { route_speeds = {
["ferry"] = 5 ["ferry"] = 5
} }
surface_speeds = { surface_speeds = {
["asphalt"] = default_speed, ["asphalt"] = default_speed,
["cobblestone:flattened"] = 10, ["cobblestone:flattened"] = 10,
["paving_stones"] = 10, ["paving_stones"] = 10,
["compacted"] = 10, ["compacted"] = 10,
["cobblestone"] = 6, ["cobblestone"] = 6,
["unpaved"] = 6, ["unpaved"] = 6,
["fine_gravel"] = 6, ["fine_gravel"] = 6,
["gravel"] = 6, ["gravel"] = 6,
["fine_gravel"] = 6, ["fine_gravel"] = 6,
["pebbelstone"] = 6, ["pebbelstone"] = 6,
["ground"] = 6, ["ground"] = 6,
["dirt"] = 6, ["dirt"] = 6,
["earth"] = 6, ["earth"] = 6,
["grass"] = 6, ["grass"] = 6,
["mud"] = 3, ["mud"] = 3,
["sand"] = 3 ["sand"] = 3
} }
take_minimum_of_speeds = true take_minimum_of_speeds = true
obey_oneway = true obey_oneway = true
obey_bollards = false obey_bollards = false
use_restrictions = true use_restrictions = true
ignore_areas = true -- future feature ignore_areas = true -- future feature
traffic_signal_penalty = 5 traffic_signal_penalty = 5
u_turn_penalty = 20 u_turn_penalty = 20
use_turn_restrictions = false use_turn_restrictions = false
turn_penalty = 60 turn_penalty = 60
turn_bias = 1.4 turn_bias = 1.4
-- End of globals -- End of globals
function get_exceptions(vector) 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) vector:Add(v)
end end
end end
function node_function (node) function node_function (node)
local barrier = node.tags:Find ("barrier") local barrier = node.tags:Find ("barrier")
local access = Access.find_access_tag(node, access_tags_hierachy) local access = Access.find_access_tag(node, access_tags_hierachy)
local traffic_signal = node.tags:Find("highway") local traffic_signal = node.tags:Find("highway")
-- flag node if it carries a traffic light -- flag node if it carries a traffic light
if traffic_signal == "traffic_signals" then if traffic_signal == "traffic_signals" then
node.traffic_light = true node.traffic_light = true
end end
-- parse access and barrier tags -- parse access and barrier tags
if access and access ~= "" then if access and access ~= "" then
if access_tag_blacklist[access] then if access_tag_blacklist[access] then
node.bollard = true node.bollard = true
else else
node.bollard = false node.bollard = false
end end
elseif barrier and barrier ~= "" then elseif barrier and barrier ~= "" then
if barrier_whitelist[barrier] then if barrier_whitelist[barrier] then
node.bollard = false node.bollard = false
else else
node.bollard = true node.bollard = true
end end
end end
return 1 return 1
end end
function way_function (way) function way_function (way)
-- initial routability check, filters out buildings, boundaries, etc -- initial routability check, filters out buildings, boundaries, etc
local highway = way.tags:Find("highway") local highway = way.tags:Find("highway")
local route = way.tags:Find("route") local route = way.tags:Find("route")
local man_made = way.tags:Find("man_made") local man_made = way.tags:Find("man_made")
local railway = way.tags:Find("railway") local railway = way.tags:Find("railway")
local amenity = way.tags:Find("amenity") local amenity = way.tags:Find("amenity")
local public_transport = way.tags:Find("public_transport") local public_transport = way.tags:Find("public_transport")
if (not highway or highway == '') and if (not highway or highway == '') and
(not route or route == '') and (not route or route == '') and
(not railway or railway=='') and (not railway or railway=='') and
(not amenity or amenity=='') and (not amenity or amenity=='') and
(not man_made or man_made=='') and (not man_made or man_made=='') and
(not public_transport or public_transport=='') (not public_transport or public_transport=='')
then then
return 0 return 0
end
-- don't route on ways or railways that are still under construction
if highway=='construction' or railway=='construction' then
return 0
end
-- access
local access = Access.find_access_tag(way, access_tags_hierachy)
if access_tag_blacklist[access] then
return 0
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
-- if no name exists, use way type
-- this encoding scheme is excepted to be a temporary solution
way.name = "{highway:"..highway.."}"
end
-- roundabout handling
if "roundabout" == junction then
way.roundabout = true;
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 end
elseif railway and platform_speeds[railway] then
-- don't route on ways or railways that are still under construction -- railway platforms (old tagging scheme)
if highway=='construction' or railway=='construction' then way.speed = platform_speeds[railway]
return 0 elseif platform_speeds[public_transport] then
end -- public_transport platforms (new tagging platform)
way.speed = platform_speeds[public_transport]
-- access
local access = Access.find_access_tag(way, access_tags_hierachy)
if access_tag_blacklist[access] then
return 0
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
-- roundabout handling
if "roundabout" == junction then
way.roundabout = true;
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 elseif railway and railway_speeds[railway] then
-- railways -- railways
if access and access_tag_whitelist[access] then if access and access_tag_whitelist[access] then
way.speed = railway_speeds[railway] way.speed = railway_speeds[railway]
way.direction = Way.bidirectional 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
end end
elseif amenity and amenity_speeds[amenity] then
-- direction -- parking areas
way.direction = Way.bidirectional way.speed = amenity_speeds[amenity]
local impliedOneway = false elseif bicycle_speeds[highway] then
if junction == "roundabout" or highway == "motorway_link" or highway == "motorway" then -- regular ways
way.direction = Way.oneway way.speed = bicycle_speeds[highway]
impliedOneway = true elseif access and access_tag_whitelist[access] then
end -- unknown way, but valid access tag
way.speed = default_speed
if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then else
way.direction = Way.oneway -- biking not allowed, maybe we can push our bike?
elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then -- essentially requires pedestrian profiling, for example foot=no mean we can't push a bike
way.direction = Way.bidirectional -- TODO: if we can push, the way should be marked as pedestrion mode, but there's no way to do it yet from lua..
elseif onewayClass == "-1" then if foot ~= 'no' then
way.direction = Way.opposite if pedestrian_speeds[highway] then
elseif oneway == "no" or oneway == "0" or oneway == "false" then -- pedestrian-only ways and areas
way.direction = Way.bidirectional way.speed = pedestrian_speeds[highway]
elseif cycleway and string.find(cycleway, "opposite") == 1 then elseif man_made and man_made_speeds[man_made] then
if impliedOneway then -- man made structures
way.direction = Way.opposite way.speed = man_made_speeds[man_made]
else elseif foot == 'yes' then
way.direction = Way.bidirectional way.speed = walking_speed
end 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
end end
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
-- cycleways if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then
if cycleway and cycleway_tags[cycleway] then way.direction = Way.oneway
way.speed = bicycle_speeds["cycleway"] elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then
elseif cycleway_left and cycleway_tags[cycleway_left] then way.direction = Way.bidirectional
way.speed = bicycle_speeds["cycleway"] elseif onewayClass == "-1" then
elseif cycleway_right and cycleway_tags[cycleway_right] then way.direction = Way.opposite
way.speed = bicycle_speeds["cycleway"] elseif oneway == "no" or oneway == "0" or oneway == "false" then
end way.direction = Way.bidirectional
elseif cycleway and string.find(cycleway, "opposite") == 1 then
-- surfaces if impliedOneway then
if surface then way.direction = Way.opposite
surface_speed = surface_speeds[surface] else
if surface_speed then way.direction = Way.bidirectional
if way.speed > 0 then
way.speed = surface_speed
end
if way.backward_speed > 0 then
way.backward_speed = surface_speed
end
end
end 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
-- maxspeed -- pushing bikes
-- TODO: maxspeed of backward direction if bicycle_speeds[highway] or pedestrian_speeds[highway] then
if take_minimum_of_speeds then if foot ~= 'no' then
if maxspeed and maxspeed>0 then if junction ~= "roundabout" then
way.speed = math.min(way.speed, maxspeed) if way.direction == Way.oneway then
end way.backward_speed = walking_speed
end 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
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
if way.speed > 0 then
way.speed = surface_speed
end
if way.backward_speed > 0 then
way.backward_speed = surface_speed
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
-- Override speed settings if explicit forward/backward maxspeeds are given -- Override speed settings if explicit forward/backward maxspeeds are given
if way.speed > 0 and maxspeed_forward ~= nil and maxspeed_forward > 0 then if way.speed > 0 and maxspeed_forward ~= nil and maxspeed_forward > 0 then
if Way.bidirectional == way.direction then if Way.bidirectional == way.direction then
way.backward_speed = way.speed 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 end
way.speed = maxspeed_forward
end
if maxspeed_backward ~= nil and maxspeed_backward > 0 then
way.backward_speed = maxspeed_backward
end
way.type = 1
return 1
way.type = 1
return 1
end end
function turn_function (angle) function turn_function (angle)
-- compute turn penalty as angle^2, with a left/right bias -- compute turn penalty as angle^2, with a left/right bias
k = turn_penalty/(90.0*90.0) k = turn_penalty/(90.0*90.0)
if angle>=0 then if angle>=0 then
return angle*angle*k/turn_bias return angle*angle*k/turn_bias
else else
return angle*angle*k*turn_bias return angle*angle*k*turn_bias
end end
end end

View File

@ -1,8 +1,8 @@
-- Begin of globals -- Begin of globals
--require("lib/access") --function temporarily inlined --require("lib/access") --function temporarily inlined
barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true, ["entrance"] = true} barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = 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_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_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true, ["emergency"] = true }
access_tag_restricted = { ["destination"] = true, ["delivery"] = true } access_tag_restricted = { ["destination"] = true, ["delivery"] = true }
access_tags = { "motorcar", "motor_vehicle", "vehicle" } access_tags = { "motorcar", "motor_vehicle", "vehicle" }
@ -32,13 +32,13 @@ speed_profile = {
["default"] = 10 ["default"] = 10
} }
local take_minimum_of_speeds = false local take_minimum_of_speeds = false
local obey_oneway = true local obey_oneway = true
local obey_bollards = true local obey_bollards = true
local use_turn_restrictions = true local use_turn_restrictions = true
local ignore_areas = true -- future feature local ignore_areas = true -- future feature
local traffic_signal_penalty = 2 local traffic_signal_penalty = 2
local u_turn_penalty = 20 local u_turn_penalty = 20
local abs = math.abs local abs = math.abs
local min = math.min local min = math.min
@ -58,23 +58,23 @@ local function find_access_tag(source,access_tags_hierachy)
end end
function get_exceptions(vector) 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) vector:Add(v)
end end
end end
local function parse_maxspeed(source) local function parse_maxspeed(source)
if not source then if not source then
return 0 return 0
end end
local n = tonumber(source:match("%d*")) local n = tonumber(source:match("%d*"))
if not n then if not n then
n = 0 n = 0
end end
if string.match(source, "mph") or string.match(source, "mp/h") then if string.match(source, "mph") or string.match(source, "mp/h") then
n = (n*1609)/1000; n = (n*1609)/1000;
end end
return n return n
end end
function node_function (node) function node_function (node)
@ -87,19 +87,19 @@ function node_function (node)
end end
end end
-- parse access and barrier tags -- parse access and barrier tags
if access and access ~= "" then if access and access ~= "" then
if access_tag_blacklist[access] then if access_tag_blacklist[access] then
node.bollard = true node.bollard = true
end end
elseif node.tags:Holds("barrier") then elseif node.tags:Holds("barrier") then
local barrier = node.tags:Find("barrier") local barrier = node.tags:Find("barrier")
if barrier_whitelist[barrier] then if barrier_whitelist[barrier] then
return return
else else
node.bollard = true node.bollard = true
end end
end end
end end
function way_function (way) function way_function (way)
@ -202,7 +202,7 @@ function way_function (way)
elseif "" ~= name then elseif "" ~= name then
way.name = name way.name = name
-- else -- else
-- way.name = highway -- if no name exists, use way type -- way.name = highway -- if no name exists, use way type
end end
if "roundabout" == junction then if "roundabout" == junction then
@ -216,22 +216,21 @@ function way_function (way)
-- Set access restriction flag if service is allowed under certain restrictions only -- Set access restriction flag if service is allowed under certain restrictions only
if service ~= "" and service_tag_restricted[service] then if service ~= "" and service_tag_restricted[service] then
way.is_access_restricted = true way.is_access_restricted = true
end end
-- Set direction according to tags on way -- Set direction according to tags on way
way.direction = Way.bidirectional way.direction = Way.bidirectional
if obey_oneway then if obey_oneway then
if oneway == "-1" then if oneway == "-1" then
way.direction = Way.opposite way.direction = Way.opposite
elseif oneway == "yes" or elseif oneway == "yes" or
oneway == "1" or oneway == "1" or
oneway == "true" or oneway == "true" or
junction == "roundabout" or junction == "roundabout" or
(highway == "motorway_link" and oneway ~="no") or (highway == "motorway_link" and oneway ~="no") or
(highway == "motorway" and oneway ~= "no") (highway == "motorway" and oneway ~= "no") then
then way.direction = Way.oneway
way.direction = Way.oneway
end end
end end
@ -250,16 +249,15 @@ function way_function (way)
-- Override general direction settings of there is a specific one for our mode of travel -- Override general direction settings of there is a specific one for our mode of travel
if ignore_in_grid[highway] then if ignore_in_grid[highway] then
way.ignore_in_grid = true way.ignore_in_grid = true
end end
way.type = 1 way.type = 1
return return
end end
-- These are wrappers to parse vectors of nodes and ways and thus to speed up any tracing JIT -- These are wrappers to parse vectors of nodes and ways and thus to speed up any tracing JIT
function node_vector_function(vector) function node_vector_function(vector)
for v in vector.nodes do for v in vector.nodes do
node_function(v) node_function(v)
end end
end end

View File

@ -2,106 +2,106 @@
-- Moves at fixed, well-known speeds, practical for testing speed and travel times: -- Moves at fixed, well-known speeds, practical for testing speed and travel times:
-- Primary road: 36km/h = 36000m/3600s = 100m/10s -- Primary road: 36km/h = 36000m/3600s = 100m/10s
-- Secondary road: 18km/h = 18000m/3600s = 100m/20s -- Secondary road: 18km/h = 18000m/3600s = 100m/20s
-- Tertiary road: 12km/h = 12000m/3600s = 100m/30s -- Tertiary road: 12km/h = 12000m/3600s = 100m/30s
speed_profile = { speed_profile = {
["primary"] = 36, ["primary"] = 36,
["secondary"] = 18, ["secondary"] = 18,
["tertiary"] = 12, ["tertiary"] = 12,
["default"] = 24 ["default"] = 24
} }
-- these settings are read directly by osrm -- these settings are read directly by osrm
take_minimum_of_speeds = true take_minimum_of_speeds = true
obey_oneway = true obey_oneway = true
obey_barriers = true obey_barriers = true
use_turn_restrictions = true use_turn_restrictions = true
ignore_areas = true -- future feature ignore_areas = true -- future feature
traffic_signal_penalty = 7 -- seconds traffic_signal_penalty = 7 -- seconds
u_turn_penalty = 20 u_turn_penalty = 20
function limit_speed(speed, limits) function limit_speed(speed, limits)
-- don't use ipairs(), since it stops at the first nil value -- don't use ipairs(), since it stops at the first nil value
for i=1, #limits do for i=1, #limits do
limit = limits[i] limit = limits[i]
if limit ~= nil and limit > 0 then if limit ~= nil and limit > 0 then
if limit < speed then if limit < speed then
return limit -- stop at first speedlimit that's smaller than speed return limit -- stop at first speedlimit that's smaller than speed
end end
end
end end
return speed end
return speed
end end
function node_function (node) function node_function (node)
local traffic_signal = node.tags:Find("highway") local traffic_signal = node.tags:Find("highway")
if traffic_signal == "traffic_signals" then if traffic_signal == "traffic_signals" then
node.traffic_light = true; node.traffic_light = true;
-- TODO: a way to set the penalty value -- TODO: a way to set the penalty value
end end
return 1 return 1
end end
function way_function (way) function way_function (way)
local highway = way.tags:Find("highway") local highway = way.tags:Find("highway")
local name = way.tags:Find("name") local name = way.tags:Find("name")
local oneway = way.tags:Find("oneway") local oneway = way.tags:Find("oneway")
local route = way.tags:Find("route") local route = way.tags:Find("route")
local duration = way.tags:Find("duration") local duration = way.tags:Find("duration")
local maxspeed = tonumber(way.tags:Find ( "maxspeed")) local maxspeed = tonumber(way.tags:Find ( "maxspeed"))
local maxspeed_forward = tonumber(way.tags:Find( "maxspeed:forward")) local maxspeed_forward = tonumber(way.tags:Find( "maxspeed:forward"))
local maxspeed_backward = tonumber(way.tags:Find( "maxspeed:backward")) local maxspeed_backward = tonumber(way.tags:Find( "maxspeed:backward"))
way.name = name way.name = name
if route ~= nil and durationIsValid(duration) then if route ~= nil and durationIsValid(duration) then
way.duration = math.max( 1, parseDuration(duration) ) way.duration = math.max( 1, parseDuration(duration) )
else else
local speed_forw = speed_profile[highway] or speed_profile['default'] local speed_forw = speed_profile[highway] or speed_profile['default']
local speed_back = speed_forw local speed_back = speed_forw
if highway == "river" then if highway == "river" then
local temp_speed = speed_forw; local temp_speed = speed_forw;
speed_forw = temp_speed*1.5 speed_forw = temp_speed*1.5
speed_back = temp_speed/1.5 speed_back = temp_speed/1.5
end end
if maxspeed_forward ~= nil and maxspeed_forward > 0 then if maxspeed_forward ~= nil and maxspeed_forward > 0 then
speed_forw = maxspeed_forward speed_forw = maxspeed_forward
else else
if maxspeed ~= nil and maxspeed > 0 and speed_forw > maxspeed then if maxspeed ~= nil and maxspeed > 0 and speed_forw > maxspeed then
speed_forw = maxspeed speed_forw = maxspeed
end end
end end
if maxspeed_backward ~= nil and maxspeed_backward > 0 then if maxspeed_backward ~= nil and maxspeed_backward > 0 then
speed_back = maxspeed_backward speed_back = maxspeed_backward
else else
if maxspeed ~=nil and maxspeed > 0 and speed_back > maxspeed then if maxspeed ~=nil and maxspeed > 0 and speed_back > maxspeed then
speed_back = maxspeed speed_back = maxspeed
end end
end end
way.speed = speed_forw way.speed = speed_forw
if speed_back ~= way_forw then if speed_back ~= way_forw then
way.backward_speed = speed_back way.backward_speed = speed_back
end end
end end
if oneway == "no" or oneway == "0" or oneway == "false" then if oneway == "no" or oneway == "0" or oneway == "false" then
way.direction = Way.bidirectional way.direction = Way.bidirectional
elseif oneway == "-1" then elseif oneway == "-1" then
way.direction = Way.opposite way.direction = Way.opposite
elseif oneway == "yes" or oneway == "1" or oneway == "true" then elseif oneway == "yes" or oneway == "1" or oneway == "true" then
way.direction = Way.oneway way.direction = Way.oneway
else else
way.direction = Way.bidirectional way.direction = Way.bidirectional
end end
way.type = 1 way.type = 1
return 1 return 1
end end