From 00d638f2dadd59428a5040359e4e691a79a51e8a Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 4 May 2026 01:10:02 +0300 Subject: [PATCH] auto-sync: 2026-05-04 01:10:01 --- tasks/enduro-trails/osrm/enduro.lua | 113 ++++++++++++---------------- 1 file changed, 49 insertions(+), 64 deletions(-) diff --git a/tasks/enduro-trails/osrm/enduro.lua b/tasks/enduro-trails/osrm/enduro.lua index 222a081..b700f53 100644 --- a/tasks/enduro-trails/osrm/enduro.lua +++ b/tasks/enduro-trails/osrm/enduro.lua @@ -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")