2015-05-01 14:06:45 -04:00
|
|
|
-- Car profile
|
|
|
|
local find_access_tag = require("lib/access").find_access_tag
|
2016-04-27 07:24:25 -04:00
|
|
|
local get_destination = require("lib/destination").get_destination
|
2016-06-24 10:06:45 -04:00
|
|
|
local set_classification = require("lib/guidance").set_classification
|
|
|
|
local get_turn_lanes = require("lib/guidance").get_turn_lanes
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2015-05-01 14:06:45 -04:00
|
|
|
-- Begin of globals
|
2015-01-09 13:15:00 -05:00
|
|
|
barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["checkpoint"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["lift_gate"] = true, ["no"] = true, ["entrance"] = true }
|
2015-09-03 05:15:03 -04:00
|
|
|
access_tag_whitelist = { ["yes"] = true, ["motorcar"] = true, ["motor_vehicle"] = true, ["vehicle"] = true, ["permissive"] = true, ["designated"] = true, ["destination"] = true }
|
2016-04-04 05:49:40 -04:00
|
|
|
access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true, ["emergency"] = true, ["psv"] = true, ["delivery"] = true }
|
2012-09-19 12:35:45 -04:00
|
|
|
access_tag_restricted = { ["destination"] = true, ["delivery"] = true }
|
2016-04-04 05:09:13 -04:00
|
|
|
access_tags_hierarchy = { "motorcar", "motor_vehicle", "vehicle", "access" }
|
2012-09-19 12:35:45 -04:00
|
|
|
service_tag_restricted = { ["parking_aisle"] = true }
|
2013-01-05 11:32:39 -05:00
|
|
|
restriction_exception_tags = { "motorcar", "motor_vehicle", "vehicle" }
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2016-04-22 05:31:46 -04:00
|
|
|
-- A list of suffixes to suppress in name change instructions
|
2016-04-28 04:54:14 -04:00
|
|
|
suffix_list = { "N", "NE", "E", "SE", "S", "SW", "W", "NW", "North", "South", "West", "East" }
|
2016-04-22 05:31:46 -04:00
|
|
|
|
2013-06-26 13:40:25 -04:00
|
|
|
speed_profile = {
|
|
|
|
["motorway"] = 90,
|
2014-10-06 07:42:30 -04:00
|
|
|
["motorway_link"] = 45,
|
2013-06-26 13:40:25 -04:00
|
|
|
["trunk"] = 85,
|
2014-10-06 07:42:30 -04:00
|
|
|
["trunk_link"] = 40,
|
2012-09-27 05:35:56 -04:00
|
|
|
["primary"] = 65,
|
2014-10-06 07:42:30 -04:00
|
|
|
["primary_link"] = 30,
|
2012-09-27 05:35:56 -04:00
|
|
|
["secondary"] = 55,
|
2014-10-06 07:42:30 -04:00
|
|
|
["secondary_link"] = 25,
|
2012-09-27 05:35:56 -04:00
|
|
|
["tertiary"] = 40,
|
2014-10-06 07:42:30 -04:00
|
|
|
["tertiary_link"] = 20,
|
2012-09-27 05:35:56 -04:00
|
|
|
["unclassified"] = 25,
|
|
|
|
["residential"] = 25,
|
2012-09-19 12:35:45 -04:00
|
|
|
["living_street"] = 10,
|
|
|
|
["service"] = 15,
|
|
|
|
-- ["track"] = 5,
|
|
|
|
["ferry"] = 5,
|
2015-02-26 08:56:01 -05:00
|
|
|
["movable"] = 5,
|
2013-02-04 12:38:15 -05:00
|
|
|
["shuttle_train"] = 10,
|
2013-08-19 11:36:15 -04:00
|
|
|
["default"] = 10
|
2012-09-19 12:35:45 -04:00
|
|
|
}
|
|
|
|
|
2014-03-24 08:44:23 -04:00
|
|
|
|
2014-10-07 07:50:53 -04:00
|
|
|
-- surface/trackype/smoothness
|
|
|
|
-- values were estimated from looking at the photos at the relevant wiki pages
|
|
|
|
|
|
|
|
-- max speed for surfaces
|
|
|
|
surface_speeds = {
|
2014-10-10 04:34:34 -04:00
|
|
|
["asphalt"] = nil, -- nil mean no limit. removing the line has the same effect
|
2014-10-07 07:50:53 -04:00
|
|
|
["concrete"] = nil,
|
|
|
|
["concrete:plates"] = nil,
|
|
|
|
["concrete:lanes"] = nil,
|
|
|
|
["paved"] = nil,
|
2014-03-24 08:44:23 -04:00
|
|
|
|
|
|
|
["cement"] = 80,
|
|
|
|
["compacted"] = 80,
|
|
|
|
["fine_gravel"] = 80,
|
2014-10-10 04:34:34 -04:00
|
|
|
|
2014-03-24 08:44:23 -04:00
|
|
|
["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,
|
|
|
|
|
2014-10-07 07:50:53 -04:00
|
|
|
["earth"] = 20,
|
2014-03-24 08:44:23 -04:00
|
|
|
["stone"] = 20,
|
|
|
|
["rocky"] = 20,
|
|
|
|
["sand"] = 20,
|
|
|
|
|
|
|
|
["mud"] = 10
|
|
|
|
}
|
|
|
|
|
2014-10-07 07:50:53 -04:00
|
|
|
-- max speed for tracktypes
|
2014-03-24 08:44:23 -04:00
|
|
|
tracktype_speeds = {
|
|
|
|
["grade1"] = 60,
|
|
|
|
["grade2"] = 40,
|
|
|
|
["grade3"] = 30,
|
|
|
|
["grade4"] = 25,
|
|
|
|
["grade5"] = 20
|
|
|
|
}
|
|
|
|
|
2014-10-07 07:50:53 -04:00
|
|
|
-- max speed for smoothnesses
|
2014-03-24 08:44:23 -04:00
|
|
|
smoothness_speeds = {
|
|
|
|
["intermediate"] = 80,
|
|
|
|
["bad"] = 40,
|
|
|
|
["very_bad"] = 20,
|
|
|
|
["horrible"] = 10,
|
|
|
|
["very_horrible"] = 5,
|
|
|
|
["impassable"] = 0
|
|
|
|
}
|
|
|
|
|
2014-10-04 08:12:14 -04:00
|
|
|
-- http://wiki.openstreetmap.org/wiki/Speed_limits
|
|
|
|
maxspeed_table_default = {
|
|
|
|
["urban"] = 50,
|
|
|
|
["rural"] = 90,
|
|
|
|
["trunk"] = 110,
|
|
|
|
["motorway"] = 130
|
|
|
|
}
|
|
|
|
|
|
|
|
-- List only exceptions
|
|
|
|
maxspeed_table = {
|
2014-12-23 05:30:45 -05:00
|
|
|
["ch:rural"] = 80,
|
|
|
|
["ch:trunk"] = 100,
|
|
|
|
["ch:motorway"] = 120,
|
2014-10-04 08:12:14 -04:00
|
|
|
["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,
|
2016-04-08 18:04:11 -04:00
|
|
|
["uk:motorway"] = (70*1609)/1000,
|
|
|
|
["none"] = 140
|
2014-10-04 08:12:14 -04:00
|
|
|
}
|
|
|
|
|
2016-03-21 17:42:47 -04:00
|
|
|
-- set profile properties
|
|
|
|
properties.u_turn_penalty = 20
|
|
|
|
properties.traffic_signal_penalty = 2
|
|
|
|
properties.use_turn_restrictions = true
|
2016-04-12 12:47:00 -04:00
|
|
|
properties.continue_straight_at_waypoint = true
|
2016-07-18 09:34:12 -04:00
|
|
|
properties.left_hand_driving = false
|
2014-04-28 11:26:31 -04:00
|
|
|
|
2016-03-21 17:42:47 -04:00
|
|
|
local side_road_speed_multiplier = 0.8
|
2015-12-15 05:23:27 -05:00
|
|
|
|
2016-03-21 17:42:47 -04:00
|
|
|
local turn_penalty = 10
|
2015-08-30 13:17:19 -04:00
|
|
|
-- Note: this biases right-side driving. Should be
|
|
|
|
-- inverted for left-driving countries.
|
2016-07-18 09:34:12 -04:00
|
|
|
local turn_bias = properties.left_hand_driving and 1/1.2 or 1.2
|
2015-08-30 13:17:19 -04:00
|
|
|
|
2016-03-21 17:42:47 -04:00
|
|
|
local obey_oneway = true
|
|
|
|
local ignore_areas = true
|
2016-07-31 12:19:50 -04:00
|
|
|
local ignore_hov_ways = true
|
2016-08-04 06:04:49 -04:00
|
|
|
local ignore_toll_ways = true
|
2014-02-14 12:17:37 -05:00
|
|
|
|
|
|
|
local abs = math.abs
|
|
|
|
local min = math.min
|
|
|
|
local max = math.max
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2014-05-09 05:11:14 -04:00
|
|
|
local speed_reduction = 0.8
|
2014-03-27 13:22:04 -04:00
|
|
|
|
2016-04-22 05:31:46 -04:00
|
|
|
function get_name_suffix_list(vector)
|
|
|
|
for index,suffix in ipairs(suffix_list) do
|
|
|
|
vector:Add(suffix)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-01-05 11:32:39 -05:00
|
|
|
function get_exceptions(vector)
|
2014-03-27 16:19:26 -04:00
|
|
|
for i,v in ipairs(restriction_exception_tags) do
|
|
|
|
vector:Add(v)
|
|
|
|
end
|
2012-11-12 11:00:36 -05:00
|
|
|
end
|
|
|
|
|
2012-11-03 03:19:01 -04:00
|
|
|
local function parse_maxspeed(source)
|
2014-03-27 16:19:26 -04:00
|
|
|
if not source then
|
|
|
|
return 0
|
|
|
|
end
|
|
|
|
local n = tonumber(source:match("%d*"))
|
2014-10-04 08:12:14 -04:00
|
|
|
if n then
|
|
|
|
if string.match(source, "mph") or string.match(source, "mp/h") then
|
2015-09-02 06:23:26 -04:00
|
|
|
n = (n*1609)/1000
|
2014-10-04 08:12:14 -04:00
|
|
|
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
|
2014-03-27 16:19:26 -04:00
|
|
|
end
|
|
|
|
return n
|
2012-11-03 03:19:01 -04:00
|
|
|
end
|
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
function node_function (node, result)
|
2014-03-27 16:19:26 -04:00
|
|
|
-- parse access and barrier tags
|
2016-04-04 05:09:13 -04:00
|
|
|
local access = find_access_tag(node, access_tags_hierarchy)
|
2015-05-15 11:01:21 -04:00
|
|
|
if access and access ~= "" then
|
2014-03-27 16:19:26 -04:00
|
|
|
if access_tag_blacklist[access] then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.barrier = true
|
2014-03-27 16:19:26 -04:00
|
|
|
end
|
2014-08-27 10:44:40 -04:00
|
|
|
else
|
|
|
|
local barrier = node:get_value_by_key("barrier")
|
|
|
|
if barrier and "" ~= barrier then
|
2015-08-25 08:46:05 -04:00
|
|
|
-- make an exception for rising bollard barriers
|
|
|
|
local bollard = node:get_value_by_key("bollard")
|
|
|
|
local rising_bollard = bollard and "rising" == bollard
|
|
|
|
|
|
|
|
if not barrier_whitelist[barrier] and not rising_bollard then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.barrier = true
|
|
|
|
end
|
2014-03-27 16:19:26 -04:00
|
|
|
end
|
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
-- check if node is a traffic light
|
|
|
|
local tag = node:get_value_by_key("highway")
|
|
|
|
if tag and "traffic_signals" == tag then
|
2015-09-02 06:23:26 -04:00
|
|
|
result.traffic_lights = true
|
2014-08-27 10:44:40 -04:00
|
|
|
end
|
|
|
|
end
|
2014-07-24 12:00:37 -04:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
function way_function (way, result)
|
|
|
|
local highway = way:get_value_by_key("highway")
|
|
|
|
local route = way:get_value_by_key("route")
|
2015-02-26 08:56:01 -05:00
|
|
|
local bridge = way:get_value_by_key("bridge")
|
2014-07-24 12:00:37 -04:00
|
|
|
|
2015-02-26 08:56:01 -05:00
|
|
|
if not ((highway and highway ~= "") or (route and route ~= "") or (bridge and bridge ~= "")) then
|
2014-07-24 12:00:37 -04:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2013-06-26 13:40:25 -04:00
|
|
|
-- we dont route over areas
|
2014-08-27 10:44:40 -04:00
|
|
|
local area = way:get_value_by_key("area")
|
|
|
|
if ignore_areas and area and "yes" == area then
|
|
|
|
return
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2016-07-31 12:19:50 -04:00
|
|
|
-- respect user-preference for HOV-only ways
|
|
|
|
local hov = way:get_value_by_key("hov")
|
|
|
|
if ignore_hov_ways and hov and "designated" == hov then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2016-08-04 06:04:49 -04:00
|
|
|
-- respect user-preference for toll=yes ways
|
|
|
|
local toll = way:get_value_by_key("toll")
|
|
|
|
if ignore_toll_ways and toll and "yes" == toll then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2013-06-26 13:40:25 -04:00
|
|
|
-- check if oneway tag is unsupported
|
2014-08-27 10:44:40 -04:00
|
|
|
local oneway = way:get_value_by_key("oneway")
|
|
|
|
if oneway and "reversible" == oneway then
|
2013-08-16 11:10:02 -04:00
|
|
|
return
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
local impassable = way:get_value_by_key("impassable")
|
|
|
|
if impassable and "yes" == impassable then
|
|
|
|
return
|
2013-11-18 10:54:52 -05:00
|
|
|
end
|
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
local status = way:get_value_by_key("status")
|
|
|
|
if status and "impassable" == status then
|
|
|
|
return
|
2013-11-18 10:54:52 -05:00
|
|
|
end
|
|
|
|
|
2013-06-26 13:40:25 -04:00
|
|
|
-- Check if we are allowed to access the way
|
2016-04-04 05:09:13 -04:00
|
|
|
local access = find_access_tag(way, access_tags_hierarchy)
|
2013-06-26 13:40:25 -04:00
|
|
|
if access_tag_blacklist[access] then
|
2013-08-16 11:10:02 -04:00
|
|
|
return
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2012-10-04 08:18:39 -04:00
|
|
|
|
2016-02-25 14:03:49 -05:00
|
|
|
result.forward_mode = mode.driving
|
|
|
|
result.backward_mode = mode.driving
|
|
|
|
|
2015-02-26 08:56:01 -05:00
|
|
|
-- handling ferries and piers
|
2014-02-14 12:17:37 -05:00
|
|
|
local route_speed = speed_profile[route]
|
2015-02-26 08:56:01 -05:00
|
|
|
if (route_speed and route_speed > 0) then
|
2015-09-02 06:23:26 -04:00
|
|
|
highway = route
|
2014-08-27 10:44:40 -04:00
|
|
|
local duration = way:get_value_by_key("duration")
|
|
|
|
if duration and durationIsValid(duration) then
|
2015-09-02 06:23:26 -04:00
|
|
|
result.duration = max( parseDuration(duration), 1 )
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2016-02-25 14:03:49 -05:00
|
|
|
result.forward_mode = mode.ferry
|
|
|
|
result.backward_mode = mode.ferry
|
2014-08-27 10:44:40 -04:00
|
|
|
result.forward_speed = route_speed
|
|
|
|
result.backward_speed = route_speed
|
2014-02-14 12:17:37 -05:00
|
|
|
end
|
|
|
|
|
2015-02-26 08:56:01 -05:00
|
|
|
-- handling movable bridges
|
|
|
|
local bridge_speed = speed_profile[bridge]
|
2015-02-26 10:22:18 -05:00
|
|
|
local capacity_car = way:get_value_by_key("capacity:car")
|
|
|
|
if (bridge_speed and bridge_speed > 0) and (capacity_car ~= 0) then
|
2015-09-02 06:23:26 -04:00
|
|
|
highway = bridge
|
2015-02-26 08:56:01 -05:00
|
|
|
local duration = way:get_value_by_key("duration")
|
|
|
|
if duration and durationIsValid(duration) then
|
2015-09-02 06:23:26 -04:00
|
|
|
result.duration = max( parseDuration(duration), 1 )
|
2015-02-26 08:56:01 -05:00
|
|
|
end
|
|
|
|
result.forward_speed = bridge_speed
|
|
|
|
result.backward_speed = bridge_speed
|
|
|
|
end
|
|
|
|
|
2016-06-24 10:06:45 -04:00
|
|
|
-- leave early if this way is not accessible
|
2014-02-14 12:17:37 -05:00
|
|
|
if "" == highway then
|
|
|
|
return
|
2013-02-04 06:13:30 -05:00
|
|
|
end
|
2013-06-26 13:40:25 -04:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
if result.forward_speed == -1 then
|
2014-02-14 12:17:37 -05:00
|
|
|
local highway_speed = speed_profile[highway]
|
2014-08-27 10:44:40 -04:00
|
|
|
local max_speed = parse_maxspeed( way:get_value_by_key("maxspeed") )
|
2014-02-14 12:17:37 -05:00
|
|
|
-- Set the avg speed on the way if it is accessible by road class
|
|
|
|
if highway_speed then
|
2014-08-27 10:44:40 -04:00
|
|
|
if max_speed and max_speed > highway_speed then
|
|
|
|
result.forward_speed = max_speed
|
|
|
|
result.backward_speed = max_speed
|
2014-02-14 12:17:37 -05:00
|
|
|
-- max_speed = math.huge
|
|
|
|
else
|
2014-08-27 10:44:40 -04:00
|
|
|
result.forward_speed = highway_speed
|
|
|
|
result.backward_speed = highway_speed
|
2014-02-14 12:17:37 -05:00
|
|
|
end
|
2013-06-26 13:40:25 -04:00
|
|
|
else
|
2014-02-14 12:17:37 -05:00
|
|
|
-- Set the avg speed on ways that are marked accessible
|
2015-09-03 05:15:03 -04:00
|
|
|
if access_tag_whitelist[access] then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.forward_speed = speed_profile["default"]
|
|
|
|
result.backward_speed = speed_profile["default"]
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
end
|
2014-02-14 12:17:37 -05:00
|
|
|
if 0 == max_speed then
|
|
|
|
max_speed = math.huge
|
|
|
|
end
|
2014-08-27 10:44:40 -04:00
|
|
|
result.forward_speed = min(result.forward_speed, max_speed)
|
|
|
|
result.backward_speed = min(result.backward_speed, max_speed)
|
2013-02-04 06:13:30 -05:00
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
if -1 == result.forward_speed and -1 == result.backward_speed then
|
2014-02-14 12:17:37 -05:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2015-12-15 05:23:27 -05:00
|
|
|
-- reduce speed on special side roads
|
|
|
|
local sideway = way:get_value_by_key("side_road")
|
|
|
|
if "yes" == sideway or
|
|
|
|
"rotary" == sideway then
|
|
|
|
result.forward_speed = result.forward_speed * side_road_speed_multiplier
|
|
|
|
result.backward_speed = result.backward_speed * side_road_speed_multiplier
|
|
|
|
end
|
|
|
|
|
2014-03-24 08:44:23 -04:00
|
|
|
-- reduce speed on bad surfaces
|
2014-10-13 07:53:46 -04:00
|
|
|
local surface = way:get_value_by_key("surface")
|
|
|
|
local tracktype = way:get_value_by_key("tracktype")
|
|
|
|
local smoothness = way:get_value_by_key("smoothness")
|
2014-03-24 08:44:23 -04:00
|
|
|
|
|
|
|
if surface and surface_speeds[surface] then
|
2014-10-13 07:53:46 -04:00
|
|
|
result.forward_speed = math.min(surface_speeds[surface], result.forward_speed)
|
|
|
|
result.backward_speed = math.min(surface_speeds[surface], result.backward_speed)
|
2014-03-24 08:44:23 -04:00
|
|
|
end
|
|
|
|
if tracktype and tracktype_speeds[tracktype] then
|
2014-10-13 07:53:46 -04:00
|
|
|
result.forward_speed = math.min(tracktype_speeds[tracktype], result.forward_speed)
|
|
|
|
result.backward_speed = math.min(tracktype_speeds[tracktype], result.backward_speed)
|
2014-03-24 08:44:23 -04:00
|
|
|
end
|
|
|
|
if smoothness and smoothness_speeds[smoothness] then
|
2014-10-13 07:53:46 -04:00
|
|
|
result.forward_speed = math.min(smoothness_speeds[smoothness], result.forward_speed)
|
|
|
|
result.backward_speed = math.min(smoothness_speeds[smoothness], result.backward_speed)
|
2014-03-24 08:44:23 -04:00
|
|
|
end
|
|
|
|
|
2016-06-24 10:06:45 -04:00
|
|
|
-- set the road classification based on guidance globals configuration
|
|
|
|
set_classification(highway,result)
|
|
|
|
|
2014-02-14 12:17:37 -05:00
|
|
|
-- parse the remaining tags
|
2014-08-27 10:44:40 -04:00
|
|
|
local name = way:get_value_by_key("name")
|
2016-05-25 21:35:38 -04:00
|
|
|
local pronunciation = way:get_value_by_key("name:pronunciation")
|
2014-08-27 10:44:40 -04:00
|
|
|
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")
|
2014-02-14 12:17:37 -05:00
|
|
|
|
|
|
|
-- Set the name that will be used for instructions
|
2015-05-30 13:00:30 -04:00
|
|
|
local has_ref = ref and "" ~= ref
|
|
|
|
local has_name = name and "" ~= name
|
2016-05-25 21:35:38 -04:00
|
|
|
local has_pronunciation = pronunciation and "" ~= pronunciation
|
2015-05-30 13:00:30 -04:00
|
|
|
|
|
|
|
if has_name and has_ref then
|
|
|
|
result.name = name .. " (" .. ref .. ")"
|
|
|
|
elseif has_ref then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.name = ref
|
2015-05-30 13:00:30 -04:00
|
|
|
elseif has_name then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.name = name
|
2016-05-25 21:35:38 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
if has_pronunciation then
|
|
|
|
result.pronunciation = pronunciation
|
2014-02-14 12:17:37 -05:00
|
|
|
end
|
|
|
|
|
2016-05-13 13:18:00 -04:00
|
|
|
local turn_lanes = ""
|
|
|
|
local turn_lanes_forward = ""
|
|
|
|
local turn_lanes_backward = ""
|
|
|
|
|
2016-06-24 10:06:45 -04:00
|
|
|
turn_lanes, turn_lanes_forward, turn_lanes_backward = get_turn_lanes(way)
|
2016-06-28 05:00:01 -04:00
|
|
|
if turn_lanes and turn_lanes ~= "" then
|
2016-05-13 13:18:00 -04:00
|
|
|
result.turn_lanes_forward = turn_lanes;
|
|
|
|
result.turn_lanes_backward = turn_lanes;
|
|
|
|
else
|
2016-06-28 05:00:01 -04:00
|
|
|
if turn_lanes_forward and turn_lanes_forward ~= "" then
|
2016-05-13 13:18:00 -04:00
|
|
|
result.turn_lanes_forward = turn_lanes_forward;
|
|
|
|
end
|
|
|
|
|
2016-06-28 05:00:01 -04:00
|
|
|
if turn_lanes_backward and turn_lanes_backward ~= "" then
|
2016-05-13 13:18:00 -04:00
|
|
|
result.turn_lanes_backward = turn_lanes_backward;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2016-06-02 09:03:28 -04:00
|
|
|
if junction and "roundabout" == junction then
|
2015-09-02 06:23:26 -04:00
|
|
|
result.roundabout = true
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2013-02-04 06:13:30 -05:00
|
|
|
|
2012-09-19 12:35:45 -04:00
|
|
|
-- Set access restriction flag if access is allowed under certain restrictions only
|
2013-06-26 13:40:25 -04:00
|
|
|
if access ~= "" and access_tag_restricted[access] then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.is_access_restricted = true
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2012-09-19 12:35:45 -04:00
|
|
|
|
|
|
|
-- Set access restriction flag if service is allowed under certain restrictions only
|
2014-08-27 10:44:40 -04:00
|
|
|
if service and service ~= "" and service_tag_restricted[service] then
|
|
|
|
result.is_access_restricted = true
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
|
|
|
|
2012-09-19 12:35:45 -04:00
|
|
|
-- Set direction according to tags on way
|
2014-08-27 10:44:40 -04:00
|
|
|
if obey_oneway then
|
2014-03-27 16:19:26 -04:00
|
|
|
if oneway == "-1" then
|
2016-02-25 14:03:49 -05:00
|
|
|
result.forward_mode = mode.inaccessible
|
2013-07-17 10:23:57 -04:00
|
|
|
elseif oneway == "yes" or
|
2014-03-27 16:19:26 -04:00
|
|
|
oneway == "1" or
|
|
|
|
oneway == "true" or
|
|
|
|
junction == "roundabout" or
|
|
|
|
(highway == "motorway" and oneway ~= "no") then
|
2016-02-25 14:03:49 -05:00
|
|
|
result.backward_mode = mode.inaccessible
|
2016-04-29 06:28:03 -04:00
|
|
|
|
|
|
|
-- If we're on a oneway and there is no ref tag, re-use destination tag as ref.
|
|
|
|
local destination = get_destination(way)
|
|
|
|
local has_destination = destination and "" ~= destination
|
|
|
|
|
|
|
|
if has_destination and has_name and not has_ref then
|
|
|
|
result.name = name .. " (" .. destination .. ")"
|
|
|
|
end
|
2016-05-26 18:47:46 -04:00
|
|
|
|
|
|
|
result.destinations = destination
|
2012-09-19 12:35:45 -04:00
|
|
|
end
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2013-02-04 09:58:35 -05:00
|
|
|
|
|
|
|
-- Override speed settings if explicit forward/backward maxspeeds are given
|
2015-11-18 12:46:29 -05:00
|
|
|
local maxspeed_forward = parse_maxspeed(way:get_value_by_key("maxspeed:forward"))
|
|
|
|
local maxspeed_backward = parse_maxspeed(way:get_value_by_key("maxspeed:backward"))
|
2014-08-27 10:44:40 -04:00
|
|
|
if maxspeed_forward and maxspeed_forward > 0 then
|
2016-02-25 14:03:49 -05:00
|
|
|
if mode.inaccessible ~= result.forward_mode and mode.inaccessible ~= result.backward_mode then
|
2014-08-27 10:44:40 -04:00
|
|
|
result.backward_speed = result.forward_speed
|
2013-02-04 09:58:35 -05:00
|
|
|
end
|
2014-08-27 10:44:40 -04:00
|
|
|
result.forward_speed = maxspeed_forward
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2014-08-27 10:44:40 -04:00
|
|
|
if maxspeed_backward and maxspeed_backward > 0 then
|
|
|
|
result.backward_speed = maxspeed_backward
|
2013-06-26 13:40:25 -04:00
|
|
|
end
|
2013-02-04 09:58:35 -05:00
|
|
|
|
2015-11-18 12:46:29 -05:00
|
|
|
-- Override speed settings if advisory forward/backward maxspeeds are given
|
|
|
|
local advisory_speed = parse_maxspeed(way:get_value_by_key("maxspeed:advisory"))
|
|
|
|
local advisory_forward = parse_maxspeed(way:get_value_by_key("maxspeed:advisory:forward"))
|
|
|
|
local advisory_backward = parse_maxspeed(way:get_value_by_key("maxspeed:advisory:backward"))
|
|
|
|
-- apply bi-directional advisory speed first
|
|
|
|
if advisory_speed and advisory_speed > 0 then
|
2016-02-25 14:03:49 -05:00
|
|
|
if mode.inaccessible ~= result.forward_mode then
|
2015-11-18 12:46:29 -05:00
|
|
|
result.forward_speed = advisory_speed
|
|
|
|
end
|
2016-02-25 14:03:49 -05:00
|
|
|
if mode.inaccessible ~= result.backward_mode then
|
2015-11-18 12:46:29 -05:00
|
|
|
result.backward_speed = advisory_speed
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if advisory_forward and advisory_forward > 0 then
|
2016-02-25 14:03:49 -05:00
|
|
|
if mode.inaccessible ~= result.forward_mode and mode.inaccessible ~= result.backward_mode then
|
2015-11-18 12:46:29 -05:00
|
|
|
result.backward_speed = result.forward_speed
|
|
|
|
end
|
|
|
|
result.forward_speed = advisory_forward
|
|
|
|
end
|
|
|
|
if advisory_backward and advisory_backward > 0 then
|
|
|
|
result.backward_speed = advisory_backward
|
|
|
|
end
|
|
|
|
|
2015-06-18 11:31:49 -04:00
|
|
|
local width = math.huge
|
|
|
|
local lanes = math.huge
|
|
|
|
if result.forward_speed > 0 or result.backward_speed > 0 then
|
|
|
|
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
|
|
|
|
|
|
|
|
local lanes_string = way:get_value_by_key("lanes")
|
|
|
|
if lanes_string and tonumber(lanes_string:match("%d*")) then
|
|
|
|
lanes = tonumber(lanes_string:match("%d*"))
|
|
|
|
end
|
|
|
|
end
|
2015-02-19 09:17:04 -05:00
|
|
|
|
2016-02-25 14:03:49 -05:00
|
|
|
local is_bidirectional = result.forward_mode ~= mode.inaccessible and result.backward_mode ~= mode.inaccessible
|
2015-06-26 08:34:49 -04:00
|
|
|
|
2014-05-09 05:11:14 -04:00
|
|
|
-- scale speeds to get better avg driving times
|
2014-08-27 10:44:40 -04:00
|
|
|
if result.forward_speed > 0 then
|
2015-09-02 06:23:26 -04:00
|
|
|
local scaled_speed = result.forward_speed*speed_reduction + 11
|
2015-02-20 04:28:49 -05:00
|
|
|
local penalized_speed = math.huge
|
2015-06-26 08:34:49 -04:00
|
|
|
if width <= 3 or (lanes <= 1 and is_bidirectional) then
|
2015-09-02 06:23:26 -04:00
|
|
|
penalized_speed = result.forward_speed / 2
|
2015-02-19 09:17:04 -05:00
|
|
|
end
|
2015-02-20 04:28:49 -05:00
|
|
|
result.forward_speed = math.min(penalized_speed, scaled_speed)
|
2014-08-27 10:44:40 -04:00
|
|
|
end
|
2015-02-19 09:17:04 -05:00
|
|
|
|
2014-08-27 10:44:40 -04:00
|
|
|
if result.backward_speed > 0 then
|
2015-09-02 06:23:26 -04:00
|
|
|
local scaled_speed = result.backward_speed*speed_reduction + 11
|
2015-02-20 04:28:49 -05:00
|
|
|
local penalized_speed = math.huge
|
2015-06-26 08:34:49 -04:00
|
|
|
if width <= 3 or (lanes <= 1 and is_bidirectional) then
|
2015-09-02 06:23:26 -04:00
|
|
|
penalized_speed = result.backward_speed / 2
|
2015-02-19 09:17:04 -05:00
|
|
|
end
|
2015-02-20 04:28:49 -05:00
|
|
|
result.backward_speed = math.min(penalized_speed, scaled_speed)
|
2014-05-09 05:11:14 -04:00
|
|
|
end
|
2015-12-11 17:49:41 -05:00
|
|
|
|
|
|
|
-- only allow this road as start point if it not a ferry
|
2016-02-25 14:03:49 -05:00
|
|
|
result.is_startpoint = result.forward_mode == mode.driving or result.backward_mode == mode.driving
|
2012-09-27 05:35:56 -04:00
|
|
|
end
|
2012-11-03 03:19:01 -04:00
|
|
|
|
2015-08-30 13:17:19 -04:00
|
|
|
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
|
|
|
|
end
|