auto-sync: 2026-05-13 09:10:01

This commit is contained in:
Stream
2026-05-13 09:10:03 +03:00
parent 2633254c8e
commit 2417fcedec
7 changed files with 313 additions and 0 deletions

View File

@@ -0,0 +1,229 @@
# DEV TASK: Перегенерация hypso тайлов (тест + полный прогон)
**Статус:** Ready for dev
**Проект:** enduro-trails
**Фаза:** 5.4
---
## Цель
> Сгенерировать рабочие тайлы гипсометрии из SRTM HGT файлов. Сначала тестовый прогон на 1 зуме, потом полная генерация.
## Контекст
- `merged_srtm.tif` — пустой (все пиксели = 0), merge был сделан неправильно
- `hypso_colored.tif` — тоже пустой (следствие)
- Отдельные HGT файлы рабочие: N55E037.hgt имеет высоты 100-264м
- Hillshade тайлы рабочие — значит для hillshade использовался другой VRT/merge
- Скрипт `regen_hypso.sh` существует, но его VRT тоже даёт пустой результат
- **67 HGT файлов**, 1.7 ГБ, покрытие ~37E-51E, 50N-61N
## Проблема
Скрипт `regen_hypso.sh` использует `gdalbuildvrt -vrtnodata -32768` — это корректно (nodata в SRTM = -32768). Но `merged_srtm.tif` пустой — значит при его создании что-то пошло не так. Возможно:
1. VRT создавался из пустой директории
2. Или merge делался с неправильными параметрами
3. Или файл был перезаписан пустым
**Решение:** не использовать `merged_srtm.tif`, а строить VRT напрямую из HGT файлов каждый раз.
---
## Инфраструктура
| Параметр | Значение |
|----------|----------|
| Сервер | `slin@82.22.50.71` (пароль: `motoZ@yaz2010`) |
| SSH | через ssh2 Node.js модуль |
| SRTM данные | `/home/slin/enduro-trails/data/srtm/` (67 файлов .hgt) |
| Выходная директория | `/home/slin/enduro-trails/data/terrain/hypso/` |
| URL проверки | `https://openclaw.mva154.duckdns.org/enduro/terrain/hypso/{z}/{x}/{y}.png` |
---
## Задачи
### Task 1: Тестовая генерация (1 зум, маленький участок)
**Цель:** Убедиться что pipeline работает и тайлы содержат цвет.
**Шаги:**
- [ ] **1.1** Построить VRT из HGT файлов и проверить что данные есть:
```bash
cd /home/slin/enduro-trails/data/srtm
gdalbuildvrt -vrtnodata -32768 -overwrite /tmp/hypso_test/srtm.vrt *.hgt
gdalinfo -stats /tmp/hypso_test/srtm.vrt 2>&1 | grep -E "STATISTICS_MAX|STATISTICS_MIN"
# Ожидаем: MIN > 0, MAX > 100 (реальные высоты)
```
- [ ] **1.2** Сгенерировать color-relief GeoTIFF (тестовый, обрезанный по bbox Москвы):
```bash
mkdir -p /tmp/hypso_test
# Обрезать VRT до маленького участка (Москва ±1°)
gdal_translate -projwin 36.5 56.5 38.5 55.0 /tmp/hypso_test/srtm.vrt /tmp/hypso_test/srtm_crop.tif
# Color ramp (без синего для воды, <=0 прозрачный)
cat > /tmp/hypso_test/color_ramp.txt << 'EOF'
nv 0 0 0 0
-100 0 0 0 0
0 0 0 0 0
1 57 151 105 255
50 80 165 110 255
100 120 180 100 255
150 160 190 95 255
200 139 176 96 255
300 170 185 105 255
500 189 188 115 255
700 210 200 130 255
1000 220 206 148 255
1500 235 220 175 255
2000 210 185 140 255
2500 185 152 110 255
3000 160 120 80 255
4000 120 80 40 255
5000 200 200 200 255
EOF
# Генерация color-relief с альфа-каналом
gdaldem color-relief \
/tmp/hypso_test/srtm_crop.tif \
/tmp/hypso_test/color_ramp.txt \
/tmp/hypso_test/hypso_test.tif \
-alpha \
-of GTiff \
-co COMPRESS=LZW
# Проверить что не пустой
gdalinfo -stats /tmp/hypso_test/hypso_test.tif 2>&1 | grep "STATISTICS_MAX"
# Band 1 (Red) MAX должен быть > 0
```
- [ ] **1.3** Нарезать тайлы только для зума 10:
```bash
mkdir -p /tmp/hypso_test/tiles
gdal2tiles.py \
--zoom=10 \
--processes=4 \
--tilesize=256 \
--webviewer=none \
/tmp/hypso_test/hypso_test.tif \
/tmp/hypso_test/tiles/
# Проверить что тайлы не пустые
find /tmp/hypso_test/tiles/10/ -name "*.png" | head -5 | xargs -I{} file {}
find /tmp/hypso_test/tiles/10/ -name "*.png" -size +400c | wc -l
# Должно быть > 0 (файлы больше 400 байт = не пустые)
```
- [ ] **1.4** Скопировать тестовые тайлы в рабочую директорию и проверить через URL:
```bash
# Бэкап текущих пустых тайлов зума 10
mv /home/slin/enduro-trails/data/terrain/hypso/10 /home/slin/enduro-trails/data/terrain/hypso/10_backup
# Скопировать новые
cp -r /tmp/hypso_test/tiles/10 /home/slin/enduro-trails/data/terrain/hypso/10
# Проверить через curl (подставить реальный x/y из ls)
ls /home/slin/enduro-trails/data/terrain/hypso/10/ | head -3
```
**Критерий готовности:** Тайлы зума 10 содержат цветные пиксели (size > 400 байт). При включении гипсометрии на зуме 10 виден цветной overlay.
---
### Task 2: Полная генерация (после подтверждения Task 1)
⚠️ **НЕ ЗАПУСКАТЬ без подтверждения Славы что тест прошёл!**
**Шаги:**
- [ ] **2.1** Сгенерировать полный hypso GeoTIFF из всех HGT:
```bash
cd /home/slin/enduro-trails/data/srtm
gdalbuildvrt -vrtnodata -32768 -overwrite /tmp/terrain_gen/srtm.vrt *.hgt
gdaldem color-relief \
/tmp/terrain_gen/srtm.vrt \
/tmp/hypso_test/color_ramp.txt \
/tmp/terrain_gen/hypso_full.tif \
-alpha \
-of GTiff \
-co COMPRESS=LZW \
-co BIGTIFF=YES
# Проверить
gdalinfo -stats /tmp/terrain_gen/hypso_full.tif 2>&1 | grep "STATISTICS_MAX"
```
- [ ] **2.2** Удалить старые пустые тайлы и нарезать новые (зумы 5-14):
```bash
rm -rf /home/slin/enduro-trails/data/terrain/hypso/
mkdir -p /home/slin/enduro-trails/data/terrain/hypso/
gdal2tiles.py \
--zoom=5-14 \
--processes=4 \
--tilesize=256 \
--webviewer=none \
/tmp/terrain_gen/hypso_full.tif \
/home/slin/enduro-trails/data/terrain/hypso/
echo "Done. Tile count:"
find /home/slin/enduro-trails/data/terrain/hypso/ -name "*.png" | wc -l
```
- [ ] **2.3** Проверить результат:
```bash
# Тайлы не пустые
find /home/slin/enduro-trails/data/terrain/hypso/10/ -name "*.png" -size +400c | wc -l
# Должно быть > 1000
```
**Критерий готовности:** Тайлы зумов 5-14 содержат цветные данные. Гипсометрия видна на карте.
---
## Проверка (Acceptance)
| # | Проверка | Команда / Действие | Ожидаемый результат |
|---|----------|-------------------|---------------------|
| 1 | VRT не пустой | `gdalinfo -stats srtm.vrt` | MAX > 100 |
| 2 | Тестовый тайл цветной | `file tiles/10/x/y.png` | PNG > 400 байт |
| 3 | UI — гипсометрия видна | Включить на зуме 10 | Цветной overlay |
---
## Ограничения и контекст
- ⚠️ SSH только через Node.js ssh2 (бинарный ssh сломан)
- ⚠️ gdal2tiles на зумах 5-15 для полного покрытия может занять **несколько часов** — запускать в screen/tmux
- ⚠️ Зум 15 генерит огромное количество тайлов — для теста достаточно 5-14
- ⚠️ Color ramp: значения <=0 должны быть прозрачными (alpha=0), иначе вода/моря будут цветными
- ⚠️ TMS scheme — gdal2tiles по умолчанию генерит TMS, app.js использует `scheme: 'tms'` — совпадает
- 🚫 Не трогать hillshade тайлы — они рабочие
- 🚫 Task 2 не запускать без подтверждения
---
## Деплой-чеклист
- [ ] VRT из HGT содержит реальные данные (stats > 0)
- [ ] Тестовый color-relief не пустой
- [ ] Тестовые тайлы зума 10 цветные
- [ ] UI проверка — гипсометрия видна на карте
- [ ] (После подтверждения) Полная генерация запущена
- [ ] Полные тайлы на месте и видны в UI
---
*Создано: 2026-05-13 | Автор ТЗ: Стрим | Исполнитель: Dev-агент*

View File

@@ -0,0 +1,44 @@
# Dev Report: Тестовая генерация hypso тайлов (Task 1)
Дата: 2026-05-13
Статус: DONE
## Задача
Тестовая генерация hypso тайлов из SRTM данных — зум 10, обрезанный участок (Москва).
## Проблема (root cause)
Оригинальный `gdalbuildvrt` запускался из директории SRTM (`cd /home/slin/.../srtm && gdalbuildvrt ... *.hgt`), но VRT сохранялся в `/tmp/`. В VRT пути к файлам записывались как относительные (`N50E038.hgt`), и при чтении VRT из `/tmp/` GDAL не мог найти файлы → пустой результат.
**Решение:** использовать `-input_file_list` с абсолютными путями (через `find ... -name "*.hgt" > list.txt`).
## Сделано
- [x] 1.1 Построен VRT из 67 HGT файлов с абсолютными путями
- [x] 1.2 Сгенерирован color-relief GeoTIFF (bbox 36.5-38.5E, 55.0-56.5N)
- [x] 1.3 Нарезаны тайлы зума 10 (56 тайлов, 40 non-empty >400 байт, крупнейшие ~55KB)
- [x] 1.4 Тайлы скопированы в production директорию, старые забэкаплены
## Результаты проверок
| Проверка | Результат |
|----------|-----------|
| VRT stats | MIN=-21, MAX=340 ✅ |
| Crop stats (Moscow) | MIN=84, MAX=298 ✅ |
| Color-relief bands | R max=169, G max=190, B max=105, A max=255 ✅ |
| Тайлы зума 10 | 56 total, 40 non-empty (>400b), max size 55KB ✅ |
| Deploy | `/home/slin/enduro-trails/data/terrain/hypso/10/` — 7 X-dirs (615-621) ✅ |
## Изменённые файлы (на сервере)
- `/home/slin/enduro-trails/data/terrain/hypso/10/` — новые тайлы (из `/tmp/hypso_test/tiles/10/`)
- `/home/slin/enduro-trails/data/terrain/hypso/10_backup/` — бэкап старых пустых тайлов
- `/tmp/hypso_test/` — рабочая директория (VRT, crop, color-relief, tiles)
## URL для проверки в UI
```
https://openclaw.mva154.duckdns.org/enduro/terrain/hypso/10/619/703.png (55KB)
https://openclaw.mva154.duckdns.org/enduro/terrain/hypso/10/620/706.png (47KB)
```
## Ключевой урок
При использовании `gdalbuildvrt` с выходным файлом в другой директории — всегда использовать абсолютные пути к исходным файлам (через `-input_file_list` или полные пути в аргументах). Относительные пути в VRT резолвятся от расположения VRT файла, а не от CWD при создании.
## Следующий шаг
Task 2 (полная генерация зумов 5-14) — ждёт подтверждения от Славы что тест прошёл в UI.

View File

@@ -0,0 +1,40 @@
{
"timestamp": "2026-05-13T06:05:01.545Z",
"testFile": "TEST_CASES_UI_TERRAIN_EXT.md",
"results": [
{
"id": "TC-T-07",
"name": "Гипсометрия на зуме 10",
"viewport": "desktop",
"status": "completed",
"screenshots": [
"TC-T-07-desktop-hypso-zoom10.png",
"TC-T-07-desktop-check-1778652284169.png"
],
"checks": [
{
"description": "Гипсометрия включена на зуме 10. Должен быть виден цветной полупрозрачный слой (зелёные тона для равнины ЦФО) поверх базовой карты.",
"screenshot": "TC-T-07-desktop-check-1778652284169.png"
}
],
"errors": []
},
{
"id": "TC-T-08",
"name": "Hillshade на зуме 11",
"viewport": "desktop",
"status": "completed",
"screenshots": [
"TC-T-08-desktop-hillshade-zoom11.png",
"TC-T-08-desktop-check-1778652301246.png"
],
"checks": [
{
"description": "Оба слоя включены на зуме 11: гипсометрия (цвет) + отмывка (тени). Должны быть видны тени на склонах рельефа.",
"screenshot": "TC-T-08-desktop-check-1778652301246.png"
}
],
"errors": []
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB