From 5e7a362b24b89a2744f5653b3620c9a66d8d9989 Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 4 May 2026 01:00:01 +0300 Subject: [PATCH] auto-sync: 2026-05-04 01:00:01 --- tasks/enduro-trails/PROJECT.md | 163 ++++++++++------ .../TASKS/active/prototype-setup/TASK.md | 178 ++++++++++++------ 2 files changed, 221 insertions(+), 120 deletions(-) diff --git a/tasks/enduro-trails/PROJECT.md b/tasks/enduro-trails/PROJECT.md index 9e73f03..7cbc59c 100644 --- a/tasks/enduro-trails/PROJECT.md +++ b/tasks/enduro-trails/PROJECT.md @@ -16,99 +16,138 @@ | Фича | Описание | |------|----------| -| 🛤️ **"Дикий путь"** | Роутинг А→Б с максимизацией грунтовок | +| 🛤️ **"Дикий путь"** | Роутинг А→Б с максимизацией грунтовок (OSRM) | +| 🔍 **"Поиск"** | Поиск населённых пунктов и адресов (Nominatim) | +| 📏 **"Линейка"** | Измерение расстояния между точками на карте | +| 🚩 **"Флажки/метки"** | Расстановка именованных меток на карте | +| 🗺️ **"Умный маршрут"** | Промежуточные точки, % асфальт/грунт/тропа, GPX экспорт | | 🎨 **"Красивый маршрут"** | Замкнутый круг через водоёмы, виды, заброшки | -| 🏔️ **"Горка"** | Макс набор высоты, мин дистанция | +| 🏔️ **"Горка"** | Макс набор высоты, мин дистанция (SRTM) | | 🔗 **"Связка"** | Соединить два трека грунтовками | | 📍 **"Разведка"** | Грунтовки вокруг точки | | 🚧 **"Препятствия"** | Броды, шлагбаумы, болота, ЛЭП | | 🌐 **"Народные треки"** | Сбор и отображение треков с внешних сервисов | -| 🔍 **"Поиск"** | Поиск населённых пунктов, адресов и объектов как на обычных картах | | 🌙 **"День/ночь"** | Переключатель темы — светлая/тёмная карта | | 🎨 **"Эндуро-дизайн"** | Современный агрессивный UI в духе эндуро/оффроад | -| 📏 **"Линейка"** | Измерение расстояния между точками на карте | -| 🚩 **"Флажки/метки"** | Расстановка именованных меток на карте | -| 🗺️ **"Умный маршрут"** | Промежуточные точки, расстояние между ними, % асфальт/грунт/тропа | ## Регионы 1. **ЦФО + Чувашия** (первый регион, прототип) 2. Расширение на новые ФО по запросу -## План - -Прототип (mva154) → проверка концепта → новая VM с PostGIS + OSRM → масштабируемая платформа - ## Архитектура -Схема: `../../enduro_architecture.png` -Концепт: [CONCEPT.md](CONCEPT.md) - ### Стек - Pyrosm/Osmium → парсинг PBF -- Spatialite/PostGIS → хранение -- OSRM (кастомный профиль) → роутинг -- FastAPI → бэкенд +- Spatialite → хранение (прототип), PostGIS → продакшен +- OSRM (кастомный профиль `enduro.lua`) → роутинг +- FastAPI + uvicorn (4 workers) → бэкенд - MapLibre GL JS → фронт (веб + PWA) -## Хостинг +### Инфраструктура (прототип) -- **Прототип:** `slin@82.22.50.71`, контейнер `prototype-enduro-trails-1`, порт `5558` +- **Сервер:** `slin@82.22.50.71`, sudo пароль `motoZ@yaz2010` +- **Контейнер:** `prototype-enduro-trails-1`, порт `5558` - **URL:** `https://openclaw.mva154.duckdns.org/enduro/` -- **Продакшен:** новая VM (4 vCPU, 8 GB RAM, 50 GB диск) +- **Код на сервере:** `/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 через `openclaw.mva154.duckdns.org` -- ✅ Фронт: MapLibre GL JS, легенда (Lev1-2 / Lev3-5 / Тропа) -- ✅ Тропы — красный пунктир, асфальт скрыт -- ✅ Кнопки: 🧭 компас (север/свободный), 📍 геолокация с маркером -- ✅ Попапы с name, surface, tracktype, length_m, mtb_scale +### ✅ Готово -## План развития +**Инфраструктура:** +- Прототип задеплоен: `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 -| Фаза | Что | Статус | -|------|-----|--------| -| Фаза 1 | Прототип — визуализация OSM треков | ✅ Готово | -| Фаза 2 | OSRM роутинг + "Дикий путь" | 🔄 В работе | -| Фаза 3 | SRTM рельеф + уклоны + "Горка" | ⏳ Планируется | -| Фаза 4 | "Красивый маршрут", "Связка", "Разведка" | ⏳ Планируется | -| Фаза 5 | PWA + оффлайн | ⏳ Планируется | -| Фаза 6 | Народные треки — сбор с внешних сервисов | ⏳ Планируется | +**Карта и 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 -### Фаза 6: Народные треки (детали) +**Фичи:** +- ✅ Роутинг "Дикий путь" — кнопка 🗺️, маркеры A/B, карточка с дистанцией и временем +- ✅ Поиск (Nominatim) — строка в хедере, debounce 400ms, flyTo +- ✅ Линейка 📏 — кружки точно на координатах, плашки над ними, крестик удаления, haversine расстояние -Источники для сбора: -- **OSM Traces** — публичные GPS-треки загруженные в OSM, бесплатно, API открытый -- **Wikiloc** — огромная база треков эндуристов/велосипедистов/туристов, есть API -- **Komoot** — активно используется эндуристами и велотуристами -- **Strava** — велосипедисты, бегуны (API платный для массового сбора) -- **4x4travel.ru** — джипперы, форум с GPX-файлами -- **Enduroad.ru** — эндуро-сообщество -- **Garmin Connect** — публичные активности +### 🔄 В работе -Реализация: -- Сборщик треков → конвертация в GeoJSON → отдельная таблица `community_tracks` в БД -- Отдельный слой на карте "Народные треки" (другой цвет, можно вкл/выкл) -- Фильтрация по типу активности: мото / велосипед / джип / пеший -- Атрибуты: источник, автор, дата, рейтинг, тип активности +- 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 -| Компонент | Объём | -|-----------|--------| -| PBF (регион) | ~150-200 MB | -| Spatialite/PostGIS | ~500 MB - 1 GB | -| OSRM граф | ~1-3 GB | -| SRTM DEM | ~2-3 GB | -| Тайлы (z10-16) | ~2-5 GB | -| **Итого** | **~5-12 GB** | +### ⏳ Бэклог + +**Фаза 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`, фильтрация по типу активности + +## Схема БД + +```sql +-- 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 на крестике линейки | Клик не проваливался на карту и не ставил новую точку | --- diff --git a/tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md b/tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md index 62a1658..b070247 100644 --- a/tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md +++ b/tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md @@ -1,6 +1,6 @@ # Прототип Enduro Trails на mva154 -**Статус:** done +**Статус:** active **Приоритет:** high **Проект:** proj_enduro_trails @@ -8,50 +8,24 @@ ## Задача -Настроить прототип на mva154 для проверки концепции Enduro Trails. +Настроить и развить прототип на mva154 для проверки концепции Enduro Trails. -## Что делаем +--- -### 1. PBF Парсинг (ЦФО + Чувашия) -- Скачать PBF дамп европейской части России с Geofabrik -- Отфильтровать по bounding box (ЦФО + Чувашия) -- Распарсить highway=track, highway=path с тегами surface, tracktype, mtb:scale -- Сохранить GeoJSON в `tasks/enduro-trails/data/` +## ✅ Выполнено -### 2. Spatialite -- Импортировать отфильтрованные дороги в Spatialite -- Создать базовые индексы для поиска -- Добавить слой POI (водоёмы, видовые точки, брошенные объекты) +### Фаза 1 — Базовый прототип (2026-05-02) -### 3. Базовый рендеринг тайлов -- Настроить tileserver-gl или самописный генератор тайлов -- Стиль: грунтовки яркие, асфальт серый -- Поддержка z10-z16 - -### 4. Веб-карта (MapLibre GL) -- Простой HTML + MapLibre GL JS -- Загрузка тайлов -- Базовые контролы слоёв - -## Критерии выполнения - -- [x] Скачан и отфильтрован PBF дамп -- [x] Парсинг → Spatialite работает (1 141 926 треков, 14 882 POI) -- [x] Тайлы генерируются с кастомным стилем (MVT через FastAPI) -- [x] Веб-карта показывает грунтовки ярко, асфальт тускло -- [x] Клик по дороге → информация (название, surface, tracktype, length_m, mtb_scale) - -## Стабилизация v0.1 (2026-05-02) - -- [x] `parse.py` — bbox-колонки и индекс `idx_trails_bbox`, `lon`/`lat` для poi -- [x] `app.py` — `length_m`/`mtb_scale` в props, SQL bbox-фильтр для POI, валидация z/x/y, параметризованный LIMIT -- [x] `index.html` — JS вынесен в `app.js`, CSS в `app.css`, `toggleLayer` через `window._map`, правильные `layerGroups` ids -- [x] `requirements.txt` — `mapbox-vector-tile==2.2.0`, без parse-зависимостей -- [x] Создан `Dockerfile`, обновлён `docker-compose.yml` -- [x] Создан `scripts/smoke_check.py` +- [x] PBF парсинг ЦФО + Чувашия → Spatialite (1 141 926 треков, 14 882 POI) +- [x] `parse.py` — bbox-колонки, индекс `idx_trails_bbox`, `lon`/`lat` для poi +- [x] `app.py` — MVT тайлы через FastAPI, `length_m`/`mtb_scale` в props, SQL bbox-фильтр, валидация z/x/y +- [x] `index.html` + `app.js` + `app.css` — MapLibre GL JS фронт +- [x] `requirements.txt` — `mapbox-vector-tile==2.2.0` +- [x] `Dockerfile` + `docker-compose.yml` +- [x] `scripts/smoke_check.py` - [x] Задеплоено на `82.22.50.71:5558`, smoke checks прошли -## Оптимизация и улучшения (2026-05-03) +### Оптимизация (2026-05-03) - [x] LRU-кэш тайлов (512 тайлов в памяти, gzip) - [x] Упрощение геометрии по зуму (Shapely simplify, адаптивный tolerance) @@ -60,34 +34,122 @@ - [x] Dockerfile пересобран — контейнер стартует мгновенно без apt/pip - [x] Nginx location `/enduro/` → HTTPS через `openclaw.mva154.duckdns.org` - [x] Все пути в фронте относительные — работает и через nginx, и по прямому IP + +### UI/UX (2026-05-03) + - [x] Кнопка 🧭 компас (север/свободный режим) - [x] Кнопка 📍 геолокация с пульсирующим маркером -- [x] Тропы — красный пунктир, асфальт скрыт -- [x] Легенда: Lev1-2 / Lev3-5 / Тропа +- [x] Тропы (path/footway/bridleway) — красный пунктир (#cc0000) +- [x] Асфальт скрыт (visibility: none, opacity: 0) +- [x] Легенда: Lev1-2 / Lev3-5 / Тропа (компактно, без асфальта) +- [x] Раскраска: Lev1-2 жёлтый (#FFD700), Lev3-5 красный (#FF4400), одинаковая толщина +- [x] Подложка: raster-saturation -0.4, raster-contrast 0.25, raster-brightness-max 0.9 +- [x] Попапы: name, surface, tracktype, length_m, mtb_scale -## Данные для ЦФО + Чувашия +### Фаза 2 — Роутинг + Поиск + Линейка (2026-05-03) -**BBOX (приблизительно):** -- Запад: 30.0 -- Восток: 45.0 -- Юг: 51.0 -- Север: 59.0 +- [x] OSRM граф собран с кастомным `enduro.lua` профилем (3 попытки, с 6 GB swap) +- [x] Swap добавлен: `/home/slin/swapfile3` (4 GB), итого 6 GB +- [x] OSRM роутер запущен: контейнер `osrm-osrm-routed-1`, порт `5559` +- [x] API endpoint `/api/route` в `app.py` (httpx → OSRM) +- [x] Фронт роутинга: кнопка 🗺️, маркеры A/B, карточка с дистанцией и временем +- [x] Поиск (Nominatim): строка в хедере, debounce 400ms, limit 6, countrycodes=ru, flyTo +- [x] Линейка 📏: кружки точно на координатах (anchor:center), плашки над ними (offset [0,-20]), крестик с stopPropagation, haversine расстояние -**PBF источник:** `https://download.geofabrik.de/russia/centralfederal.ru-latest.osm.pbf` -Чувашия может быть включена или отдельным дампом — нужно проверить Geofabrik +--- -## Техстек +## 🔄 В работе -- **Парсинг:** Pyrosm (Python) -- **Хранение:** Spatialite -- **Тайлы:** TileServer GL или Python + Pillow/Mapnik -- **Фронт:** MapLibre GL JS (CDN) +### OSRM пересборка (3-я итерация, запущена 2026-05-03 ~21:00 UTC) -## Примечания +**Проблема:** маршрут шёл по Ленинградскому шоссе вместо грунтовок. +**Причина:** `weight_name = 'duration'` → OSRM оптимизирует по времени, асфальт быстрее. +**Решение:** +- `weight_name = 'routability'` +- `forward_rate = penalty` (penalty/метр, не делённый на скорость) +- Штрафы: track=1, tertiary=15, secondary=25, primary=40, trunk=60, motorway=999 -- Прототип локальный (mva154:5558 или другой порт) -- Без роутинга на этом этапе (только визуализация) -- OSRM ставим в фазе 2 +**Проверить после сборки:** маршрут Хоругвино → Дятлово должен идти по грунтовкам, не по Ленинградке. + +--- + +## ⏳ Бэклог + +### Фаза 3 — Умный маршрут +- [ ] Промежуточные точки (перетаскиваемые waypoints) +- [ ] Статистика маршрута: % асфальт / 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` +- [ ] Фильтрация по типу активности (мото / вело / джип / пеший) + +--- + +## Технические детали + +### Файловая структура на сервере + +``` +/home/slin/enduro-trails/ +├── prototype/ ← код контейнера (= workspace/tasks/enduro-trails/prototype/) +│ ├── app.py +│ ├── Dockerfile +│ ├── docker-compose.yml +│ ├── requirements.txt +│ └── static/ +│ ├── index.html +│ ├── app.js +│ ├── app.css +│ └── style.json +├── data/ +│ ├── centralfederal.sqlite (431 MB, БД треков) +│ ├── enduro.osm.pbf (PBF для OSRM) +│ └── enduro.osrm.* (граф OSRM) +└── osrm/ + ├── enduro.lua (кастомный профиль) + └── docker-compose.yml (OSRM роутер) +``` + +### Деплой + +```bash +# Обновить статику и пересобрать контейнер +cd /home/slin/enduro-trails/prototype +docker compose up -d --build +``` + +### OSRM пересборка + +```bash +cd /home/slin/enduro-trails/osrm +docker compose run --rm osrm-prepare +docker compose up -d +``` + +### Проверка OSRM + +```bash +curl "http://localhost:5559/route/v1/driving/36.8,56.1;36.9,56.2?overview=full&geometries=geojson" +``` ---