Files
wiki/tasks/enduro-trails/osrm/enduro.lua
2026-05-04 00:10:01 +03:00

135 lines
3.6 KiB
Lua

-- enduro.lua — OSRM профиль для эндуро-роутинга "Дикий путь"
-- weight = штраф для выбора маршрута (грунтовки дешевле асфальта)
-- duration = реальное время (для ETA)
-- Разделены явно через result.weight и result.duration
api_version = 4
-- Штраф за метр пути (меньше = предпочтительнее)
local highway_penalty = {
track = 1.0,
bridleway = 1.2,
path = 1.3,
cycleway = 1.5,
footway = 2.0,
unclassified = 3.0,
residential = 5.0,
service = 6.0,
tertiary = 15.0,
tertiary_link= 15.0,
secondary = 25.0,
secondary_link = 25.0,
primary = 40.0,
primary_link = 40.0,
trunk = 60.0,
trunk_link = 60.0,
motorway = 999.0,
motorway_link= 999.0,
}
-- Скорости (км/ч) — только для ETA
local highway_speeds = {
track = 30,
bridleway = 20,
path = 20,
cycleway = 25,
footway = 15,
unclassified = 40,
residential = 40,
service = 30,
tertiary = 60,
tertiary_link= 60,
secondary = 60,
secondary_link = 60,
primary = 60,
primary_link = 60,
trunk = 60,
trunk_link = 60,
motorway = 90,
motorway_link= 90,
}
-- Мультипликатор по качеству грунтовки
local tracktype_multiplier = {
grade1 = 1.0,
grade2 = 1.1,
grade3 = 1.2,
grade4 = 1.4,
grade5 = 1.6,
}
function setup()
return {
properties = {
weight_name = 'routability',
max_speed_for_map_matching = 30/3.6,
call_tagless_node_function = false,
traffic_light_penalty = 2,
u_turn_penalty = 20,
continue_straight_at_waypoint = false,
use_turn_restrictions = false,
}
}
end
function process_node(profile, node, result)
local barrier = node:get_value_by_key("barrier")
if barrier == "gate" or barrier == "bollard" or barrier == "lift_gate" then
result.barrier = true
end
end
function process_way(profile, way, result)
local highway = way:get_value_by_key("highway")
if not highway then return end
local penalty = highway_penalty[highway]
if not penalty then return end
local speed = highway_speeds[highway] or 30
-- Мультипликатор по tracktype
local tracktype = way:get_value_by_key("tracktype")
if tracktype and tracktype_multiplier[tracktype] then
penalty = penalty * tracktype_multiplier[tracktype]
end
result.forward_mode = mode.driving
result.backward_mode = mode.driving
-- duration = реальное время (секунды на метр)
local speed_mps = speed / 3.6
result.forward_speed = speed
result.backward_speed = speed
-- weight = штраф для роутера (penalty на метр)
-- forward_rate/backward_rate задают weight_per_meter
result.forward_rate = penalty
result.backward_rate = penalty
-- Одностороннее движение
local oneway = way:get_value_by_key("oneway")
if oneway == "yes" or oneway == "1" or oneway == "true" then
result.backward_mode = mode.inaccessible
elseif oneway == "-1" then
result.forward_mode = mode.inaccessible
end
end
function process_turn(profile, turn)
turn.duration = 0
turn.weight = 0
if turn.is_u_turn then
turn.duration = profile.properties.u_turn_penalty
turn.weight = profile.properties.u_turn_penalty
end
end
return {
setup = setup,
process_way = process_way,
process_node = process_node,
process_turn = process_turn,
}