feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1058) #1137

Merged
bot-reviewer merged 2 commits from feat/ekb-genplan-functional-zones into main 2026-06-07 12:03:39 +00:00
Owner

Что

Ingest функциональных зон генплана ЕКБ-2045 (ред. 545-П) из открытого WFS ГИСОГД-СО (gisogd66.midural.ru) — закрывает ИРД-1 #1058 (был needs-human; источник найден разведкой 2026-06-07, см. коммент в #1058). Это заполнит пустое поле functional_zone в ИРД-блоке analyze (сейчас stub None — слой муниципального геопортала пуст).

Источник (подтверждён живым fetch, без auth/капчи)

  • /api/catalogs/agate_ekbgo → resolve слоя «Функциональные зоны» (суффикс-хеш версии, не хардкод) → WFS GetFeature GeoJSON, ~6436 фич, EPSG:4326, Polygon.
  • Атрибуты: тип зоны (full_name/urban10_classid_v), код класса, статус (существ./план.), площадь га, globalid (UUID, дедуп).

Состав

  • data/sql/139_ekb_genplan_functional_zone.sql — таблица (UNIQUE globalid, GIST geom), idempotent.
  • gisogd_so_client.py — resolve layer + fetch WFS.
  • genplan_zones_sync.py — Celery harvest (upsert by globalid) + beat weekly.
  • functional_zone_lookup.pyparcel_functional_zones(db, wkt) graceful (read-side).
  • Тесты (мок WFS/DB).

NB (follow-up)

  • Врезка parcel_functional_zones в build_ird_analyze_block (заменяет stub None) — отдельный follow-up после merge (избегаем конфликта по ird_analyze.py с #1131).
  • После merge+deploy: ручной прогон sync_functional_zones (ожидаем ~6436).
  • Лицензия reuse данных ГИСОГД-СО не проверена (официальные открытые); параметрические поля зон преим. null, тип зоны надёжен.

Closes #1058 (ingest-часть). Часть #1067.

## Что Ingest функциональных зон генплана ЕКБ-2045 (ред. 545-П) из открытого WFS **ГИСОГД-СО** (`gisogd66.midural.ru`) — закрывает ИРД-1 #1058 (был needs-human; источник найден разведкой 2026-06-07, см. коммент в #1058). Это заполнит пустое поле `functional_zone` в ИРД-блоке analyze (сейчас stub `None` — слой муниципального геопортала пуст). ## Источник (подтверждён живым fetch, без auth/капчи) - `/api/catalogs/agate_ekbgo` → resolve слоя «Функциональные зоны» (суффикс-хеш версии, не хардкод) → WFS GetFeature GeoJSON, **~6436 фич**, EPSG:4326, Polygon. - Атрибуты: тип зоны (full_name/urban10_classid_v), код класса, статус (существ./план.), площадь га, globalid (UUID, дедуп). ## Состав - `data/sql/139_ekb_genplan_functional_zone.sql` — таблица (UNIQUE globalid, GIST geom), idempotent. - `gisogd_so_client.py` — resolve layer + fetch WFS. - `genplan_zones_sync.py` — Celery harvest (upsert by globalid) + beat weekly. - `functional_zone_lookup.py` — `parcel_functional_zones(db, wkt)` graceful (read-side). - Тесты (мок WFS/DB). ## NB (follow-up) - Врезка `parcel_functional_zones` в `build_ird_analyze_block` (заменяет stub `None`) — отдельный follow-up после merge (избегаем конфликта по ird_analyze.py с #1131). - После merge+deploy: ручной прогон `sync_functional_zones` (ожидаем ~6436). - Лицензия reuse данных ГИСОГД-СО не проверена (официальные открытые); параметрические поля зон преим. null, тип зоны надёжен. Closes #1058 (ingest-часть). Часть #1067.
lekss361 added 1 commit 2026-06-07 11:58:17 +00:00
feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1058)
Some checks failed
CI / changes (push) Successful in 6s
CI / changes (pull_request) Successful in 5s
CI / backend-tests (pull_request) Successful in 6m25s
CI / backend-tests (push) Has been cancelled
6bb9de92c2
lekss361 added the
GG-форсайт
scope/backend
scrapers
site-finder
labels 2026-06-07 11:58:42 +00:00
bot-backend added 1 commit 2026-06-07 11:59:39 +00:00
Merge remote-tracking branch 'forgejo/main' into feat/ekb-genplan-functional-zones
All checks were successful
CI / changes (push) Successful in 8s
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / frontend-tests (push) Has been skipped
CI / backend-tests (push) Successful in 6m23s
CI / backend-tests (pull_request) Successful in 6m21s
5514721a1c
# Conflicts:
#	backend/app/workers/celery_app.py
bot-reviewer approved these changes 2026-06-07 12:03:31 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — ingest генплан функц.зон ГИСОГД-СО (закрывает ingest-часть #1058). Качественная реализация.

Verified prod (deploy-safety): миграция 139_ekb_genplan_functional_zone.sql — таблица отсутствует, 139 не в _schema_migrations → применится один раз. Idempotent (BEGIN/COMMIT, CREATE TABLE/INDEX IF NOT EXISTS, guarded UNIQUE(globalid) DO-block, GIST на geom). Merge-risk: миграция + live beat (но изолированный/graceful).

Сильные места:

  • TLS robust_http_get_json пробует verify=True, при ConnectError (SSL-fail оборачивается в него) fallback на verify=False. Не dead-on-arrival как #1126 был; на проде заработает в любом случае.
  • Pagination-fallback при таймауте; catalog-resolve хеша слоя с hardcode-fallback (суффикс-хеш версии не захардкожен) — устойчиво к обновлению генплана.
  • SAVEPOINT per-row, graceful fetch/lookup (→ []), geom уже 4326 (ST_SetSRID без transform), globalid-дедуп, raw_props для forward-compat. Тесты обширные (resolve/pagination/savepoint/mapping/dedup).
  • functional_zone_lookup НЕ вшит в analyze (follow-up, избегает конфликта с #1131) → consistent с #1115 stub functional_zone=None; на analyze пока не влияет.

🟡 MINOR → follow-up (не блокеры):

  1. Единственный db.commit() в конце на ~6436-row прогоне — Celery WorkerLost mid-run теряет всё (тот же паттерн, что #1116). Per-batch commit добавит durability. p3.
  2. Главное: врезка parcel_functional_zones в build_ird_analyze_block (заменить stub None) — это и есть смысл #1058; сделать отдельным PR (как автор отметил). p2.

Данные: таблица пуста на проде (sync не прогнан) → lookup пока []; ~6436 заполнятся после ручного sync_functional_zones / beat (пн 06:30). Не сверял живьём (внешний WFS + пустая таблица; автор подтвердил fetch).

Merging (squash).

<!-- gendesign-review-bot: sha=5514721 verdict=approve --> ✅ **APPROVE** — ingest генплан функц.зон ГИСОГД-СО (закрывает ingest-часть #1058). Качественная реализация. **Verified prod (deploy-safety):** миграция `139_ekb_genplan_functional_zone.sql` — таблица отсутствует, `139` не в `_schema_migrations` → применится один раз. Idempotent (BEGIN/COMMIT, CREATE TABLE/INDEX IF NOT EXISTS, guarded UNIQUE(globalid) DO-block, GIST на geom). **Merge-risk: миграция + live beat (но изолированный/graceful).** **Сильные места:** - **TLS robust** — `_http_get_json` пробует `verify=True`, при `ConnectError` (SSL-fail оборачивается в него) fallback на `verify=False`. Не dead-on-arrival как #1126 был; на проде заработает в любом случае. - Pagination-fallback при таймауте; catalog-resolve хеша слоя с hardcode-fallback (суффикс-хеш версии не захардкожен) — устойчиво к обновлению генплана. - SAVEPOINT per-row, graceful fetch/lookup (→ []), geom уже 4326 (ST_SetSRID без transform), globalid-дедуп, raw_props для forward-compat. Тесты обширные (resolve/pagination/savepoint/mapping/dedup). - `functional_zone_lookup` НЕ вшит в analyze (follow-up, избегает конфликта с #1131) → consistent с #1115 stub `functional_zone=None`; на analyze пока не влияет. **🟡 MINOR → follow-up (не блокеры):** 1. Единственный `db.commit()` в конце на ~6436-row прогоне — Celery WorkerLost mid-run теряет всё (тот же паттерн, что #1116). Per-batch commit добавит durability. p3. 2. **Главное:** врезка `parcel_functional_zones` в `build_ird_analyze_block` (заменить stub `None`) — это и есть смысл #1058; сделать отдельным PR (как автор отметил). p2. Данные: таблица пуста на проде (sync не прогнан) → lookup пока []; ~6436 заполнятся после ручного `sync_functional_zones` / beat (пн 06:30). Не сверял живьём (внешний WFS + пустая таблица; автор подтвердил fetch). Merging (squash).
bot-reviewer merged commit 189ecc81f8 into main 2026-06-07 12:03:39 +00:00
bot-reviewer deleted branch feat/ekb-genplan-functional-zones 2026-06-07 12:03:40 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1137
No description provided.