auto-sync: 2026-05-04 09:40:01

This commit is contained in:
Stream
2026-05-04 09:40:01 +03:00
parent 3867eda080
commit ff6c156a29
9 changed files with 101 additions and 53 deletions

View File

@@ -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 (экспорт)

View File

@@ -1,5 +1,9 @@
# Dev Task: Стабилизация прототипа Enduro Trails v0.1
> ⚠️ **АРХИВ (выполнено 02.05.2026)** — все задачи из Definition of Done выполнены.
> Документ описывает состояние "до фиксов" — сохранён для исторического контекста.
> Актуальное состояние проекта — в `PROJECT.md`.
**Приоритет:** HIGH
**Тип:** стабилизация, без новых фич
**Проект:** enduro-trails

View File

@@ -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
```
## Ключевые решения

View File

@@ -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` запускает всё одной командой
---

View File

@@ -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

View File

@@ -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 должен быть 022, 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-сервера |
## Деплой (обновление файлов без пересборки)

View File

@@ -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

View File

@@ -20,10 +20,10 @@
</div>
<div id="controls">
<button class="toggle-btn active" id="btn-tracks" onclick="toggleLayer('tracks')">
<span class="dot" style="background:#FF8C00"></span> Грунтовки
<span class="dot" style="background:#FFD700"></span><span class="dot" style="background:#FF4400; margin-left:2px"></span> Грунтовки
</button>
<button class="toggle-btn active" id="btn-paths" onclick="toggleLayer('paths')">
<span class="dot" style="background:#FFD700"></span> Тропы
<span class="dot" style="background:#cc0000"></span> Тропы
</button>
<button class="toggle-btn active" id="btn-poi" onclick="toggleLayer('poi')">
<span class="dot" style="background:#44ff88"></span> POI
@@ -59,11 +59,11 @@
<div id="legend">
<h3>Легенда</h3>
<div class="legend-item">
<div class="legend-line" style="background:#FFA500; height:2px"></div>
<div class="legend-line" style="background:#FFD700; height:2px"></div>
<span>Lev1-2</span>
</div>
<div class="legend-item">
<div class="legend-line" style="background:#FF8C00; height:4px"></div>
<div class="legend-line" style="background:#FF4400; height:4px"></div>
<span>Lev3-5</span>
</div>
<div class="legend-item">