auto-sync: 2026-05-04 01:10:01
This commit is contained in:
@@ -1,61 +1,48 @@
|
||||
-- enduro.lua — OSRM профиль для эндуро-роутинга "Дикий путь"
|
||||
-- weight = штраф для выбора маршрута (грунтовки дешевле асфальта)
|
||||
-- duration = реальное время (для ETA)
|
||||
-- Разделены явно через result.weight и result.duration
|
||||
--
|
||||
-- Ключевая логика:
|
||||
-- weight = distance / forward_rate
|
||||
-- Высокий rate → маленький weight → предпочтительный маршрут
|
||||
--
|
||||
-- Чтобы duration НЕ влиял на выбор маршрута:
|
||||
-- forward_speed одинаковый для всех типов дорог (30 км/ч)
|
||||
-- Тогда OSRM выбирает только по rate (грунтовки vs асфальт)
|
||||
-- ETA будет неточным, но маршрут пойдёт по грунтовкам
|
||||
--
|
||||
-- rate: track=100 (предпочтительно) ... motorway=0.1 (избегаем)
|
||||
|
||||
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,
|
||||
-- forward_rate: чем ВЫШЕ — тем ПРЕДПОЧТИТЕЛЬНЕЕ
|
||||
-- weight = distance / rate → высокий rate = низкий weight = предпочтительный путь
|
||||
local highway_rate = {
|
||||
track = 100.0,
|
||||
bridleway = 90.0,
|
||||
path = 85.0,
|
||||
cycleway = 70.0,
|
||||
footway = 60.0,
|
||||
unclassified = 20.0,
|
||||
residential = 15.0,
|
||||
service = 12.0,
|
||||
tertiary = 4.0,
|
||||
tertiary_link= 4.0,
|
||||
secondary = 2.0,
|
||||
secondary_link = 2.0,
|
||||
primary = 1.0,
|
||||
primary_link = 1.0,
|
||||
trunk = 0.3,
|
||||
trunk_link = 0.3,
|
||||
motorway = 0.1,
|
||||
motorway_link= 0.1,
|
||||
}
|
||||
|
||||
-- Мультипликатор по качеству грунтовки
|
||||
local tracktype_multiplier = {
|
||||
grade1 = 1.0,
|
||||
grade2 = 1.1,
|
||||
grade3 = 1.2,
|
||||
grade4 = 1.4,
|
||||
grade5 = 1.6,
|
||||
grade1 = 1.3,
|
||||
grade2 = 1.2,
|
||||
grade3 = 1.0,
|
||||
grade4 = 0.9,
|
||||
grade5 = 0.8,
|
||||
}
|
||||
|
||||
function setup()
|
||||
@@ -83,29 +70,27 @@ 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 rate = highway_rate[highway]
|
||||
if not rate then return end
|
||||
|
||||
local speed = highway_speeds[highway] or 30
|
||||
|
||||
-- Мультипликатор по tracktype
|
||||
-- Мультипликатор по tracktype для грунтовок
|
||||
local tracktype = way:get_value_by_key("tracktype")
|
||||
if tracktype and tracktype_multiplier[tracktype] then
|
||||
penalty = penalty * tracktype_multiplier[tracktype]
|
||||
rate = rate * 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
|
||||
-- ВАЖНО: одинаковая скорость для всех типов дорог
|
||||
-- Это гарантирует что duration не влияет на выбор маршрута
|
||||
-- Выбор идёт ТОЛЬКО по rate (грунтовки vs асфальт)
|
||||
result.forward_speed = 30
|
||||
result.backward_speed = 30
|
||||
|
||||
-- weight = штраф для роутера (penalty на метр)
|
||||
-- forward_rate/backward_rate задают weight_per_meter
|
||||
result.forward_rate = penalty
|
||||
result.backward_rate = penalty
|
||||
-- weight = distance / rate
|
||||
result.forward_rate = rate
|
||||
result.backward_rate = rate
|
||||
|
||||
-- Одностороннее движение
|
||||
local oneway = way:get_value_by_key("oneway")
|
||||
|
||||
Reference in New Issue
Block a user