From ff6c156a291cf8b971e6609457298ea2d15c472a Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 4 May 2026 09:40:01 +0300 Subject: [PATCH] auto-sync: 2026-05-04 09:40:01 --- tasks/enduro-trails/CONCEPT.md | 34 +++++----- tasks/enduro-trails/DEV_TASK.md | 4 ++ tasks/enduro-trails/PROJECT.md | 7 ++- .../{active => done}/prototype-setup/TASK.md | 0 tasks/enduro-trails/TECHNICAL_SPEC.md | 62 ++++++++++--------- tasks/enduro-trails/osrm/docker-compose.yml | 29 +++++++++ tasks/enduro-trails/prototype/README.md | 7 +++ .../prototype/docker-compose.yml | 3 +- .../enduro-trails/prototype/static/index.html | 8 +-- 9 files changed, 101 insertions(+), 53 deletions(-) rename tasks/enduro-trails/TASKS/{active => done}/prototype-setup/TASK.md (100%) create mode 100644 tasks/enduro-trails/osrm/docker-compose.yml diff --git a/tasks/enduro-trails/CONCEPT.md b/tasks/enduro-trails/CONCEPT.md index 8a8a220..d647872 100644 --- a/tasks/enduro-trails/CONCEPT.md +++ b/tasks/enduro-trails/CONCEPT.md @@ -282,32 +282,34 @@ CREATE TABLE elevation_grid ( ## Этапы реализации -### Фаза 1: MVP (дьявол в деталях) -- [ ] Настройка PBF загрузки выбранного региона -- [ ] Парсинг и фильтрация highway=track + surface -- [ ] Импорт в Spatialite -- [ ] Базовый рендеринг тайлов (грунтовки яркие, асфальт серый) -- [ ] Веб-карта с MapLibre GL +### Фаза 1: MVP — ✅ ВЫПОЛНЕНО (02.05.2026) +- [x] Настройка PBF загрузки (ЦФО + Чувашия) +- [x] Парсинг и фильтрация highway=track/path/bridleway + surface +- [x] Импорт в Spatialite (1.1M треков, 14K POI) +- [x] FastAPI self-hosted MVT тайлы (вместо TileServer GL) +- [x] Веб-карта с MapLibre GL JS -### Фаза 2: Роутинг -- [ ] Установка OSRM + кастомный профиль "Enduro" -- [ ] API для роутинга (точки А→Б → маршрут) -- [ ] "Дикий путь" — минимизация асфальта -- [ ] Экспорт GPX +### Фаза 2: Роутинг + UI — ✅ ВЫПОЛНЕНО (03.05.2026) +- [x] OSRM + кастомный профиль `enduro.lua` (порт 5559) +- [x] API endpoint `/api/route` (точки А→Б → маршрут) +- [x] "Дикий путь" — UI кнопка 🗺️, маркеры, дистанция/время +- [x] Поиск (Nominatim, debounce 400ms, flyTo) +- [x] Линейка 📏 (haversine, кружки + плашки) +- [x] Геолокация 📍, компас 🧭 -### Фаза 3: Слои и фичи +### Фаза 3: Слои и фичи — ⏳ Бёклог - [ ] Импорт SRTM DEM + расчёт уклонов - [ ] Слой рельефа -- [ ] POI (водоёмы, видовые точки, заброшки) +- [ ] Флажки/метки на карте (localStorage) - [ ] Слой препятствий (броды, шлагбаумы, болота) -### Фаза 4: Продвинутый роутинг +### Фаза 4: Продвинутый роутинг — ⏳ Бёклог - [ ] "Красивый маршрут" — через живописные места - [ ] "Горка" — макс набор высоты - [ ] "Разведка" — грунтовки вокруг точки -- [ ] Оценка маршрута (дистанция, сложность, время) +- [ ] Статистика маршрута (% грунт/асфальт), GPX экспорт -### Фаза 5: Мобильность +### Фаза 5: Мобильность — ⏳ Бёклог - [ ] PWA с оффлайн тайлами - [ ] GPS трекинг - [ ] Интеграция с OsmAnd/Locus (экспорт) diff --git a/tasks/enduro-trails/DEV_TASK.md b/tasks/enduro-trails/DEV_TASK.md index 8e302b9..2884107 100644 --- a/tasks/enduro-trails/DEV_TASK.md +++ b/tasks/enduro-trails/DEV_TASK.md @@ -1,5 +1,9 @@ # Dev Task: Стабилизация прототипа Enduro Trails v0.1 +> ⚠️ **АРХИВ (выполнено 02.05.2026)** — все задачи из Definition of Done выполнены. +> Документ описывает состояние "до фиксов" — сохранён для исторического контекста. +> Актуальное состояние проекта — в `PROJECT.md`. + **Приоритет:** HIGH **Тип:** стабилизация, без новых фич **Проект:** enduro-trails diff --git a/tasks/enduro-trails/PROJECT.md b/tasks/enduro-trails/PROJECT.md index 60dff5d..5d54269 100644 --- a/tasks/enduro-trails/PROJECT.md +++ b/tasks/enduro-trails/PROJECT.md @@ -82,7 +82,7 @@ - Прототип задеплоен: `https://openclaw.mva154.duckdns.org/enduro/` - БД: 1 141 926 треков, 14 882 POI (Spatialite) - Векторные тайлы (MVT) через FastAPI, 4 uvicorn workers -- LRU-кэш тайлов (512 тайлов в памяти) +- FIFO-кэш тайлов (512 тайлов в памяти) [реализация — FIFO, не LRU] - Упрощение геометрии по зуму (Shapely simplify) - Фильтр треков по длине на низких зумах (z8: ≥500м, z9: ≥200м) - Dockerfile — быстрый старт без apt/pip при рестарте @@ -133,11 +133,12 @@ ```sql -- trails id, osm_id, highway_type, track_type, surface, name, length_m, -mtb_scale, visibility, smoothness, access, tags, geom, +mtb_scale, visibility, smoothness, access, tags, geom BLOB, min_lon, max_lon, min_lat, max_lat -- poi -id, osm_id, poi_type, name, lon, lat, tags +id, osm_id, poi_type, name, geom BLOB, lon, lat +-- Примечание: poi НЕ имеет поля tags ``` ## Ключевые решения diff --git a/tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md b/tasks/enduro-trails/TASKS/done/prototype-setup/TASK.md similarity index 100% rename from tasks/enduro-trails/TASKS/active/prototype-setup/TASK.md rename to tasks/enduro-trails/TASKS/done/prototype-setup/TASK.md diff --git a/tasks/enduro-trails/TECHNICAL_SPEC.md b/tasks/enduro-trails/TECHNICAL_SPEC.md index ffa6d0a..95d0673 100644 --- a/tasks/enduro-trails/TECHNICAL_SPEC.md +++ b/tasks/enduro-trails/TECHNICAL_SPEC.md @@ -187,13 +187,13 @@ tasks/enduro-trails/prototype/ └── centralfederal.sqlite ``` -**Функции:** -- [ ] Отображение карты с кастомным стилем -- [ ] Контролы слоёв (вкл/выкл: грунтовки, POI) -- [ ] Клик по дороге → popup (name, surface, tracktype, length) -- [ ] Клик по POI → popup (name, type) -- [ ] Поиск по bbox (кнопка «показать всё») -- [ ] Зум/пан — стандартные +**Функции (всё выполнено ✅):** +- [x] Отображение карты с кастомным стилем +- [x] Контролы слоёв (вкл/выкл: грунтовки, POI) +- [x] Клик по дороге → popup (name, surface, tracktype, length) +- [x] Клик по POI → popup (name, type) +- [x] Поиск по bbox (кнопка «показать всё») +- [x] Зум/пан — стандартные --- @@ -201,27 +201,31 @@ tasks/enduro-trails/prototype/ ``` tasks/enduro-trails/ -├── PROJECT.md # Описание проекта (уже есть) -├── CONCEPT.md # Концепция и архитектура (уже есть) -├── TECHNICAL_SPEC.md # ⬅️ ЭТОТ ФАЙЛ (новый) +├── PROJECT.md +├── CONCEPT.md +├── TECHNICAL_SPEC.md +├── DEV_TASK.md ├── TASKS/ │ └── active/ │ └── prototype-setup/ -│ └── TASK.md # Чеклист задачи (уже есть) -├── prototype/ # ⬅️ Новая папка (создаст Dev-агент) -│ ├── app.py # FastAPI сервер -│ ├── requirements.txt # Зависимости -│ ├── docker-compose.yml # (опционально) Docker-сборка -│ ├── static/ -│ │ ├── index.html -│ │ ├── style.json -│ │ ├── app.js -│ │ └── app.css -│ └── scripts/ -│ ├── parse.py # Парсинг PBF → Spatialite -│ └── generate_tiles.py # Генерация тайлов (или конфиг для tileserver-gl) -└── data/ # ⬅️ Новая папка - └── centralfederal.sqlite # Parsed OSM data +│ └── TASK.md +├── prototype/ +│ ├── app.py # FastAPI: /api/tiles, /api/route, /api/health, /api/cache/clear +│ ├── requirements.txt +│ ├── Dockerfile +│ ├── docker-compose.yml +│ ├── README.md +│ └── static/ +│ ├── index.html +│ ├── app.js +│ ├── app.css +│ └── style.json +├── scripts/ +│ ├── parse.py # Парсинг PBF → SQLite (Spatialite) +│ ├── requirements-parse.txt +│ └── smoke_check.py +└── osrm/ + └── enduro.lua # Профиль OSRM (кастомный по грунтовкам) ``` --- @@ -232,14 +236,14 @@ tasks/enduro-trails/ 1. ✅ Скачан PBF дамп ЦФО с Geofabrik 2. ✅ `parse.py` парсит PBF → `centralfederal.sqlite` (trails + POI) -3. ✅ Тайлы генерируются (tileserver-gl или аналог) -4. ✅ Веб-карта на `localhost:5558` (или другой порт) показывает: - - Грунтовки яркие (оранжевые/жёлтые) +3. ✅ Тайлы генерируются (FastAPI on-the-fly из SQLite) +4. ✅ Веб-карта на `localhost:5558` показывает: + - Грунтовки яркие (жёлтые/красно-оранжевые) - Асфальт тусклый (серый) - POI отображаются иконками 5. ✅ Клик по дороге → popup с name, surface, tracktype, length 6. ✅ Базовые контролы слоёв (toggle trails, POI) -7. ✅ `docker-compose up` или `python app.py` запускает всё одной командой +7. ✅ `docker-compose up` запускает всё одной командой --- diff --git a/tasks/enduro-trails/osrm/docker-compose.yml b/tasks/enduro-trails/osrm/docker-compose.yml new file mode 100644 index 0000000..5e5ebce --- /dev/null +++ b/tasks/enduro-trails/osrm/docker-compose.yml @@ -0,0 +1,29 @@ +# OSRM роутинг для Enduro Trails +# +# ВАЖНО: перед первым запуском нужно собрать граф: +# +# docker run --rm -v ${DATA_DIR:-/home/slin/enduro-trails/data}:/data \ +# ghcr.io/project-osrm/osrm-backend:v5.28.0 \ +# osrm-extract -p /data/enduro.lua /data/enduro.osm.pbf +# +# docker run --rm -v ${DATA_DIR:-/home/slin/enduro-trails/data}:/data \ +# ghcr.io/project-osrm/osrm-backend:v5.28.0 \ +# osrm-partition /data/enduro.osrm +# +# docker run --rm -v ${DATA_DIR:-/home/slin/enduro-trails/data}:/data \ +# ghcr.io/project-osrm/osrm-backend:v5.28.0 \ +# osrm-customize /data/enduro.osrm +# +# После этого запускать: docker compose up osrm-routed + +version: '3.8' + +services: + osrm-routed: + image: ghcr.io/project-osrm/osrm-backend:v5.28.0 + volumes: + - ${DATA_DIR:-/home/slin/enduro-trails/data}:/data + ports: + - "5559:5000" + command: osrm-routed --algorithm mld /data/enduro.osrm --max-table-size 10000 + restart: unless-stopped diff --git a/tasks/enduro-trails/prototype/README.md b/tasks/enduro-trails/prototype/README.md index 4ddc869..0143735 100644 --- a/tasks/enduro-trails/prototype/README.md +++ b/tasks/enduro-trails/prototype/README.md @@ -55,6 +55,8 @@ scripts/ | `GET /` | Веб-карта | | `GET /api/tiles/{z}/{x}/{y}.mvt` | Векторный тайл (protobuf) | | `GET /api/health` | Статус сервера и БД | +| `GET /api/route` | Роутинг А→Б через OSRM. Параметры: `from_lon`, `from_lat`, `to_lon`, `to_lat` | +| `GET /api/cache/clear` | Принудительный сброс тайл-кэша | Валидация: z должен быть 0–22, x/y в пределах `2^z`. Иначе 400. @@ -79,12 +81,17 @@ API_BASE=http://82.22.50.71:5558 python scripts/smoke_check.py DATA_PATH=/data/centralfederal.sqlite API_BASE=http://localhost:5558 python scripts/smoke_check.py ``` +## OSRM роутинг + +Роутинг работает через внешний OSRM-контейнер. По умолчанию `OSRM_URL=http://172.22.0.1:5559` — это Docker host gateway. Профиль: `../osrm/enduro.lua`. + ## Переменные окружения | Переменная | По умолчанию | Описание | |------------|-------------|----------| | `DATA_PATH` | `../data/centralfederal.sqlite` | Путь к SQLite БД | | `PORT` | `5558` | Порт сервера | +| `OSRM_URL` | `http://172.22.0.1:5559` | URL OSRM-сервера | ## Деплой (обновление файлов без пересборки) diff --git a/tasks/enduro-trails/prototype/docker-compose.yml b/tasks/enduro-trails/prototype/docker-compose.yml index 87a4bad..ac6b180 100644 --- a/tasks/enduro-trails/prototype/docker-compose.yml +++ b/tasks/enduro-trails/prototype/docker-compose.yml @@ -33,9 +33,10 @@ services: context: . dockerfile: Dockerfile volumes: - - /home/slin/enduro-trails/data:/data + - ${DATA_DIR:-../data}:/data ports: - "5558:5558" environment: - DATA_PATH=/data/centralfederal.sqlite + - OSRM_URL=${OSRM_URL:-http://172.22.0.1:5559} restart: unless-stopped diff --git a/tasks/enduro-trails/prototype/static/index.html b/tasks/enduro-trails/prototype/static/index.html index 1778d59..67d4923 100644 --- a/tasks/enduro-trails/prototype/static/index.html +++ b/tasks/enduro-trails/prototype/static/index.html @@ -20,10 +20,10 @@