feat(sf): EKB geoportal WFS client (#1067 C7) #1083
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1083
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/ekb-geoportal-wfs-client"
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?
Что
Новый
backend/app/services/scrapers/ekb_geoportal_client.py— клиент муниципального геопортала Екатеринбурга (ИСОГД/Geometa GeoServer, ~1149 слоёв, public, без auth, нормальный TLS).Зачем / дизайн
По разведке 2026-06-06 (vault
research/EKB_Geoportal_WFS_Construction_Intel_Jun06) геопортал — единый структурный источник «землепользование + что построят» для ЕКБ, которого нет в НСПД (только геометрия+reg-номер) и в городских документах по-отдельности./api/gis/ows/3/portal/wfs— стандарт стабильнее reverse-engurbanCard, один клиент ко всем слоям: ПЗЗ терзоны/подзоны, функц.зоны генплана (#1058), КРТ (#1060), ППТ/ПМТ, инвест-зоны, ЗОУИТ.features_at_point(CQLINTERSECTS(geoloc, POINT(lon lat))),features_in_bbox(CQLBBOX),zone_index_at(crosswalk координата→индекс ПЗЗЦ-1для резолва #1059).ekburg_permits.py), типизация (EKBFeature) какnspd_client.py._http_get_jsonmodule-level → мокается в тестах.WFS_LAYERS— читаемый ключ → typeName (подтверждены live GetFeature).Тесты
7 тестов (CQL INTERSECTS/BBOX, typeName-резолв + raw passthrough, zone_index_at, from_raw, каталог).
pytest tests/test_ekb_geoportal_client.py→ 7 passed. ruff + ruff-format clean.Scope
Это WFS-ядро. Рич ПЗЗ-карточка (
urbanCard: 3 списка ВРИ + предельные параметры) — follow-up C8. parcel-резолв → analyze — D9.Refs #1067 (C7). Связано: #1058 функц.зоны, #1060 КРТ, #1059 ПЗЗ (теперь оба через этот клиент).
✅ APPROVE
Чистый net-new WFS-клиент, нулевой regression risk (импортируется только тестами, прод-вызовов нет — wiring в C8/D9):
lon/lat/bbox типизированыfloat→ f-string интерполяция не несёт CQL-синтаксиса;layerидёт вtypeNamesparam (httpx urlencode), не в CQL._http_get_jsonmodule-level — корректный паттерн для monkeypatch; 7 тестов без сети.EKBFeaturefrozen+slots;(data or {}).get("features") or []устойчив к None/missing;zone_index_atshort-circuit'ит на пустом списке.WFS_LAYERStypeNames сверены с vault recon; WMS GetFeatureInfo сознательно исключён (reproject-баг, задокументирован). ruff/format clean.Минор (advisory, → follow-up issue):
1e-05) → GeoServer CQL может отвергнуть. Для ЕКБ (~60/56) неактуально, но:.8fробастнее перед C8-wiring.User-Agent—ekburg_permits.pyшлётGenDesign/1.0; консистентность для муниципальных источников.httpx.getбезhttpx.Clientpooling — под bbox-grid burst медленнее; не correctness.Заведу один follow-up на эти три (применить при C8). Merge → deploy-verify.