230 lines
8.9 KiB
Markdown
230 lines
8.9 KiB
Markdown
# 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-агент*
|