8.0 KiB
8.0 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)
✅ Готово
Инфраструктура:
- Прототип задеплоен:
https://openclaw.mva154.duckdns.org/enduro/ - БД: 1 141 926 треков, 14 882 POI (Spatialite)
- Векторные тайлы (MVT) через FastAPI, 4 uvicorn workers
- LRU-кэш тайлов (512 тайлов в памяти)
- Упрощение геометрии по зуму (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 расстояние
🔄 В работе
- OSRM пересборка с
weight_name='routability'(3-я итерация, запущена 2026-05-03 ~21:00 UTC)- Предыдущая версия с
weight_name='duration'давала маршруты по асфальту - Новый профиль: штрафы track=1, tertiary=15, secondary=25, primary=40, trunk=60, motorway=999
- Предыдущая версия с
⏳ Бэклог
Фаза 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,
min_lon, max_lon, min_lat, max_lat
-- poi
id, osm_id, poi_type, name, lon, lat, 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