feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1058) #1137
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1137
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/ekb-genplan-functional-zones"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
Ingest функциональных зон генплана ЕКБ-2045 (ред. 545-П) из открытого WFS ГИСОГД-СО (
gisogd66.midural.ru) — закрывает ИРД-1 #1058 (был needs-human; источник найден разведкой 2026-06-07, см. коммент в #1058). Это заполнит пустое полеfunctional_zoneв ИРД-блоке analyze (сейчас stubNone— слой муниципального геопортала пуст).Источник (подтверждён живым fetch, без auth/капчи)
/api/catalogs/agate_ekbgo→ resolve слоя «Функциональные зоны» (суффикс-хеш версии, не хардкод) → WFS GetFeature GeoJSON, ~6436 фич, EPSG:4326, Polygon.Состав
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).NB (follow-up)
parcel_functional_zonesвbuild_ird_analyze_block(заменяет stubNone) — отдельный follow-up после merge (избегаем конфликта по ird_analyze.py с #1131).sync_functional_zones(ожидаем ~6436).Closes #1058 (ingest-часть). Часть #1067.
✅ 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).Сильные места:
_http_get_jsonпробуетverify=True, приConnectError(SSL-fail оборачивается в него) fallback наverify=False. Не dead-on-arrival как #1126 был; на проде заработает в любом случае.functional_zone_lookupНЕ вшит в analyze (follow-up, избегает конфликта с #1131) → consistent с #1115 stubfunctional_zone=None; на analyze пока не влияет.🟡 MINOR → follow-up (не блокеры):
db.commit()в конце на ~6436-row прогоне — Celery WorkerLost mid-run теряет всё (тот же паттерн, что #1116). Per-batch commit добавит durability. p3.parcel_functional_zonesвbuild_ird_analyze_block(заменить stubNone) — это и есть смысл #1058; сделать отдельным PR (как автор отметил). p2.Данные: таблица пуста на проде (sync не прогнан) → lookup пока []; ~6436 заполнятся после ручного
sync_functional_zones/ beat (пн 06:30). Не сверял живьём (внешний WFS + пустая таблица; автор подтвердил fetch).Merging (squash).