-- 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, }