auto-sync: 2026-05-04 09:40:01
This commit is contained in:
@@ -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 (экспорт)
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# Dev Task: Стабилизация прототипа Enduro Trails v0.1
|
||||
|
||||
> ⚠️ **АРХИВ (выполнено 02.05.2026)** — все задачи из Definition of Done выполнены.
|
||||
> Документ описывает состояние "до фиксов" — сохранён для исторического контекста.
|
||||
> Актуальное состояние проекта — в `PROJECT.md`.
|
||||
|
||||
**Приоритет:** HIGH
|
||||
**Тип:** стабилизация, без новых фич
|
||||
**Проект:** enduro-trails
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## Ключевые решения
|
||||
|
||||
@@ -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` запускает всё одной командой
|
||||
|
||||
---
|
||||
|
||||
|
||||
29
tasks/enduro-trails/osrm/docker-compose.yml
Normal file
29
tasks/enduro-trails/osrm/docker-compose.yml
Normal 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
|
||||
@@ -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-сервера |
|
||||
|
||||
## Деплой (обновление файлов без пересборки)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user