8.6 KiB
8.6 KiB
Enduro Trails 🏍️
OSM-карта с фокусом на грунтовые дороги для построения красивых эндуро-маршрутов
Статус: active (прототип задеплоен)
Старт: 2026-05-02
Автор: Слава
Концепция
Обычные карты оптимизированы под автомобили — асфальт яркий, грунтовки не видны. Enduro Trails переворачивает эту логику: грунтовки/тропы — главный слой, асфальт — тусклый фон. Плюс фичи для поиска и построения красивых маршрутов (минимум асфальта, максимум красоты).
Ключевые фичи
| Фича | Описание |
|---|---|
| 🛤️ "Дикий путь" | Роутинг А→Б с максимизацией грунтовок (OSRM) |
| 🔍 "Поиск" | Поиск населённых пунктов и адресов (Nominatim) |
| 📏 "Линейка" | Измерение расстояния между точками на карте |
| 🚩 "Флажки/метки" | Расстановка именованных меток на карте |
| 🗺️ "Умный маршрут" | Промежуточные точки, % асфальт/грунт/тропа, GPX экспорт |
| 🎨 "Красивый маршрут" | Замкнутый круг через водоёмы, виды, заброшки |
| 🏔️ "Горка" | Макс набор высоты, мин дистанция (SRTM) |
| 🔗 "Связка" | Соединить два трека грунтовками |
| 📍 "Разведка" | Грунтовки вокруг точки |
| 🚧 "Препятствия" | Броды, шлагбаумы, болота, ЛЭП |
| 🌐 "Народные треки" | Сбор и отображение треков с внешних сервисов |
| 🌙 "День/ночь" | Переключатель темы — светлая/тёмная карта |
| 🎨 "Эндуро-дизайн" | Современный агрессивный UI в духе эндуро/оффроад |
Регионы
- ЦФО + Чувашия (первый регион, прототип)
- Расширение на новые ФО по запросу
Архитектура
Стек
- Pyrosm/Osmium → парсинг PBF
- Spatialite → хранение (прототип), PostGIS → продакшен
- OSRM (кастомный профиль
enduro.lua) → роутинг - FastAPI + uvicorn (4 workers) → бэкенд
- MapLibre GL JS → фронт (веб + PWA)
Инфраструктура (прототип)
- Сервер:
slin@82.22.50.71, sudo парольmotoZ@yaz2010 - Контейнер:
prototype-enduro-trails-1, порт5558 - URL:
https://openclaw.mva154.duckdns.org/enduro/ - Код на сервере:
/home/slin/enduro-trails/prototype/ - Workspace:
/home/node/.openclaw/workspace/tasks/enduro-trails/prototype/ - БД:
/home/slin/enduro-trails/data/centralfederal.sqlite(431 MB)
OSRM
- Данные:
/home/slin/enduro-trails/data/enduro.osrm.* - PBF:
/home/slin/enduro-trails/data/enduro.osm.pbf - Профиль:
/home/slin/enduro-trails/osrm/enduro.lua - Docker compose:
/home/slin/enduro-trails/osrm/docker-compose.yml - Контейнер:
osrm-osrm-routed-1, порт5559 - OSRM_URL в app.py:
http://172.22.0.1:5559 - Swap:
/home/slin/swapfile3(4 GB), итого 6 GB swap
Текущее состояние (2026-05-03)
✅ Готово
OSRM роутинг:
- ✅ «Дикий путь» — OSRM с кастомным профилем
enduro.lua - ✅
weight_name = 'routability'(неduration— не оптимизирует по времени) - ✅
forward_speed = 30для всех типов дорог (duration не влияет на выбор) - ✅
forward_rateопределяет предпочтительность: track=100, bridleway=90, path=85, motorway=0.1 - ✅
tracktypeмультипликатор: grade1×1.3, grade3×1.0, grade5×0.8 - ✅ U-turn penalty 20s, нет односторонних ограничений
- ✅ Граф:
enduro.osrm.*(~5.2 GB), собран изenduro.osm.pbf(ЦФО + Чувашия) - ✅ Контейнер
osrm-osrm-routed-1, порт 5559, OSRM_URL=http://172.22.0.1:5559
Инфраструктура:
- Прототип задеплоен:
https://openclaw.mva154.duckdns.org/enduro/ - БД: 1 141 926 треков, 14 882 POI (Spatialite)
- Векторные тайлы (MVT) через FastAPI, 4 uvicorn workers
- FIFO-кэш тайлов (512 тайлов в памяти) [реализация — FIFO, не LRU]
- Упрощение геометрии по зуму (Shapely simplify)
- Фильтр треков по длине на низких зумах (z8: ≥500м, z9: ≥200м)
- Dockerfile — быстрый старт без apt/pip при рестарте
- Nginx
/enduro/с HTTPS
Карта и UI:
- MapLibre GL JS, легенда (Lev1-2 / Lev3-5 / Тропа)
- Раскраска: Lev1-2 жёлтый (#FFD700), Lev3-5 красный (#FF4400)
- Тропы (path/footway/bridleway) — красный пунктир (#cc0000)
- Асфальт скрыт (visibility: none)
- Подложка: saturation -0.4, contrast 0.25, brightness-max 0.9
- Кнопка 🧭 компас (север/свободный режим)
- Кнопка 📍 геолокация с пульсирующим маркером
- Попапы: name, surface, tracktype, length_m, mtb_scale
Фичи:
- ✅ Роутинг "Дикий путь" — кнопка 🗺️, маркеры A/B, карточка с дистанцией и временем
- ✅ Поиск (Nominatim) — строка в хедере, debounce 400ms, flyTo
- ✅ Линейка 📏 — кружки точно на координатах, плашки над ними, крестик удаления, haversine расстояние
⏳ Бэклог
Фаза 3 — Умный маршрут:
- Промежуточные точки (перетаскиваемые)
- Статистика: % асфальт / lev1-2 / lev3-5 / тропа
- Скачать GPX
Фаза 4 — Флажки/метки:
- Расстановка именованных меток на карте
- Сохранение в localStorage
Фаза 5 — Редизайн:
- Тёмная тема, эндуро-стиль, адаптив под мобилку
Фаза 6 — SRTM рельеф:
- "Горка" — макс набор высоты
- Профиль высот на маршруте
Фаза 7 — PWA + офлайн:
- Service Worker, офлайн MBTiles, GPS-трекинг
Фаза 8 — Народные треки:
- Источники: OSM Traces, Wikiloc, Komoot, 4x4travel.ru, Enduroad.ru
- Отдельный слой
community_tracks, фильтрация по типу активности
Схема БД
-- trails
id, osm_id, highway_type, track_type, surface, name, length_m,
mtb_scale, visibility, smoothness, access, tags, geom BLOB,
min_lon, max_lon, min_lat, max_lat
-- poi
id, osm_id, poi_type, name, geom BLOB, lon, lat
-- Примечание: poi НЕ имеет поля tags
Ключевые решения
| Решение | Причина |
|---|---|
| 4 uvicorn workers | Устранение узкого места однопоточности |
| Фильтр по length_m на низких зумах | Производительность, читаемость карты |
| Относительные пути в app.js | Работает и через nginx /enduro/, и по прямому IP |
| Dockerfile вместо inline apt+pip | Устранил 452 рестарта контейнера |
OSRM weight_name='routability' |
duration → OSRM выбирал асфальт как быстрый |
forward_rate = penalty (не /speed) |
Penalty/метр — прямой вес пути |
| Два маркера на точку линейки | Кружок anchor:center точно на координатах, плашка offset вверх |
| stopPropagation на крестике линейки | Клик не проваливался на карту и не ставил новую точку |
Ссылка на онтологию: proj_enduro_trails