diff --git a/tasks/enduro-trails/PROJECT.md b/tasks/enduro-trails/PROJECT.md index 11a02f8..e6f380c 100644 --- a/tasks/enduro-trails/PROJECT.md +++ b/tasks/enduro-trails/PROJECT.md @@ -97,7 +97,7 @@ docker restart prototype-enduro-trails-1 | F-14 | "Разведка" | Грунтовки вокруг точки, статистика по типам, POI | ⏳ Бэклог | 4 | | F-15 | "Народные треки" | OSM Traces, Wikiloc, Komoot, 4x4travel | ⏳ Бэклог | 8 | | F-16 | Тёмная тема + редизайн | Две темы (авто/светлая/тёмная), SunCalc, мобильный UI, drag-and-drop точек, расстояние по маршруту | ✅ Готово | 5 | -| F-29 | Рельеф (terrain) | Цветной рельеф (все зумы) + теневой (зум 10+). SRTM 30м, кнопка 🏔️ в toolbar с чекбоксами | 📋 BRD готов | 5.4 | +| F-29 | Рельеф (terrain) | Цветной рельеф (все зумы) + теневой (зум 10+). SRTM 30м, кнопка 🏔️ в toolbar с чекбоксами | ⚠️ В работе | 5.4 | | F-22 | Линейка UX | Расстояние сегмента под маркером, крестик удаления, зелёный Старт, панель fit-content, toast, toggle скрыть/показать, deleteRuler | ✅ Готово | 5.2 | | F-23 | Метки UX | Починен баг удаления через попап (popup.remove() перед marker.remove()) | ✅ Готово | 5.2 | | F-24 | Поиск точек маршрута | Inline Nominatim поиск в каждом wl-item, убран верхний search bar | ✅ Готово | 5.2 | @@ -204,13 +204,41 @@ docker restart prototype-enduro-trails-1 - `streaming.mode: "off"` в Telegram канале — убраны дублированные сообщения - `send_voice.sh` — убрана отправка через `openclaw message send`, только генерация OGG + `MEDIA:` директива -### 📋 Фаза 5.4 — Рельеф на карте +### ⚠️ Фаза 5.4 — Рельеф на карте (12.05.2026, в работе) **BRD:** `BRD_TERRAIN.md` -**DEV TASK:** `DEV_TASK_TERRAIN.md` -- F-29 Рельеф (terrain) — цветной (все зумы) + теневой (зум 10+) -- SRTM 30м, GDAL, растровые тайлы PNG -- Кнопка 🏔️ в toolbar с чекбоксами, localStorage -- nginx статика `/enduro/terrain/` +**DEV TASK:** `DEV_TASK_TERRAIN.md` +**TEST CASES:** `TEST_CASES_TERRAIN.md` + +**Что сделано:** +- ✅ SRTM данные скачаны (ЦФО + Чувашия) +- ✅ Hillshade тайлы сгенерированы (зумы 10-15, 3.04M тайлов) +- ✅ Hypso тайлы перегенерированы (зумы 5-15, 1.05M тайлов) — убран синий nodata +- ✅ Nginx настроен: `/enduro/terrain/` → alias `/home/slin/enduro-trails/data/terrain/` +- ✅ Cache-Control: `public, immutable` +- ✅ Кнопка 🏔️ в toolbar, попап с чекбоксами «Гипсометрия» / «Отмывка» +- ✅ localStorage персистентность состояния +- ✅ Кнопка active при включённом слое +- ✅ Попап закрывается по клику вне / повторному нажатию +- ✅ Hillshade чекбокс disabled на зуме < 10 + hint «Зум 10+» +- ✅ `scheme: 'tms'` в sources (тайлы в TMS формате) +- ✅ `bounds: [35, 45, 55, 62]` — ограничение запросов регионом данных +- ✅ Z-index: рельеф под дорогами (`beforeId` = первый road/trail layer) + +**Известные проблемы:** +- ⚠️ Гипсометрия выглядит как однородный зелёный блок на малых зумах — ЦФО равнина, мало перепадов. Нужна корректировка color ramp для лучшей дифференциации низких высот (0-200м) +- ⏳ TC-24/TC-25 (мобильный попап) — не проверены, ждут ручного тестирования + +**Тест-кейсы (TC-07..TC-25):** +- ✅ 19 из 19 автоматизируемых — зелёные +- ⏳ 2 мобильных (TC-24, TC-25) — ожидают ручной проверки + +**Технические детали:** +- Тайлы генерировались `gdal2tiles.py` без `--xyz` → формат TMS (y инвертирован) +- MapLibre source: `scheme: 'tms'` для корректного маппинга +- Color ramp: `hypso_ramp.txt`, nodata → прозрачный (alpha), убрана строка `-100 70 107 159` +- Hypso: opacity 0.55, hillshade: opacity 0.40 +- Фронтенд отдаётся через FastAPI (контейнер), статика через `docker cp` +- Terrain тайлы отдаются nginx напрямую (не через контейнер) ### ⏳ Фаза 6 — SRTM рельеф (продвинутый) - F-12 «Горка» — макс набор высоты, мин дистанция @@ -243,7 +271,10 @@ docker restart prototype-enduro-trails-1 | `docker cp` после рестарта (не до) | Образ перезаписывает статику при рестарте — cp нужен после того как контейнер поднялся | | `deploy_app2.js` только для app.py | Скрипт не копирует статику — для фронтенда использовать `deploy_static.js` + ручной cp после рестарта | | Масштабирование сегментов к `route.distance_m` | OSRM геометрия упрощена — haversine по точкам даёт ~0.2% погрешность; масштабирование даёт точное совпадение | -| `renderWaypointsList()` после `drawRouteResults()` | Список рендерится до построения маршрута — нужен повторный вызов когда `routeResults` заполнен | +| Тайлы terrain в TMS формате | `gdal2tiles.py` без `--xyz` генерирует TMS; MapLibre по умолчанию XYZ → нужен `scheme: 'tms'` в source | +| `bounds: [35, 45, 55, 62]` в terrain sources | Без bounds MapLibre запрашивает тайлы за пределами региона → 404 | +| nodata → прозрачный (alpha) | Строка `-100 70 107 159` в ramp красила водоёмы/nodata в синий; убрана, добавлен `-alpha` при генерации | +| Terrain тайлы через nginx, не через контейнер | Статика быстрее через nginx alias; контейнер обслуживает только API и фронтенд | | `streaming.mode: "off"` для Telegram | `partial` и `progress` шлют промежуточные сообщения — `off` даёт одно финальное | | Сэмплирование каждые ~500м для stats | Без этого расчёт >30с на длинных маршрутах | | Grid cache для calc_route_stats | Убирает повторные SQL запросы для близких точек |