feat(sf): EKB geoportal urbanCard — ПЗЗ-регламент content (#1067 C8) #1094

Merged
bot-reviewer merged 1 commit from feat/ekb-geoportal-urbancard into main 2026-06-06 19:05:48 +00:00
Owner

Что

Расширение ekb_geoportal_client.py — рич ПЗЗ-регламент (ИРД-content для #1059), supplement к WFS.

Pipeline (shape подтверждён live 2026-06-06, зона Ц-1, 24 ВРИ)

searchByGeom (точка → ключи UrbanTerZone/GknParcel) → urbanCard (ключи → карточка территории) → parse_zone_regulationZoneRegulation:

  • zone_index ('Ц-1') + zone_full_name ('Ц-1 Общественно-деловая зона…')
  • main_vri / conditional_vri / auxiliary_vri — ВРИ строками «код 540н + текст»
  • limit_params — предельные параметры свободным текстом (min площадь / % застройки / этажность — дальше regex/LLM-экстракт в числа)

Метод zone_regulation_at(lon, lat). _http_post_json module-level (мокается). Реальные эндпоинты: /api/gis/spatialObject/searchByGeom, /api/urbanCard/portal.

Тесты

11 passed (WFS из C7 + новые: parse_zone_regulation, zone_regulation_at pipeline по URL-моку, empty/none ветки). ruff + ruff-format clean.

Scope / next

C8a = client-резолвер. C8b (follow-up): кэш-таблица регламента по zone_index (~100 зон/город, регламент идентичен для всех участков зоны) + числовой экстракт предельных параметров.

Refs #1067 (C8), #1059 (ПЗЗ ВРИ+параметры — источник найден). Источник: vault research/EKB_Geoportal_PZZ_Content_API_Jun06.

## Что Расширение `ekb_geoportal_client.py` — рич ПЗЗ-регламент (ИРД-content для #1059), supplement к WFS. ## Pipeline (shape подтверждён live 2026-06-06, зона Ц-1, 24 ВРИ) `searchByGeom` (точка → ключи `UrbanTerZone`/`GknParcel`) → `urbanCard` (ключи → карточка территории) → `parse_zone_regulation` → `ZoneRegulation`: - `zone_index` ('Ц-1') + `zone_full_name` ('Ц-1 Общественно-деловая зона…') - `main_vri` / `conditional_vri` / `auxiliary_vri` — ВРИ строками «код 540н + текст» - `limit_params` — предельные параметры свободным текстом (min площадь / % застройки / этажность — дальше regex/LLM-экстракт в числа) Метод `zone_regulation_at(lon, lat)`. `_http_post_json` module-level (мокается). Реальные эндпоинты: `/api/gis/spatialObject/searchByGeom`, `/api/urbanCard/portal`. ## Тесты 11 passed (WFS из C7 + новые: parse_zone_regulation, zone_regulation_at pipeline по URL-моку, empty/none ветки). ruff + ruff-format clean. ## Scope / next C8a = client-резолвер. **C8b** (follow-up): кэш-таблица регламента по `zone_index` (~100 зон/город, регламент идентичен для всех участков зоны) + числовой экстракт предельных параметров. Refs #1067 (C8), #1059 (ПЗЗ ВРИ+параметры — источник найден). Источник: vault `research/EKB_Geoportal_PZZ_Content_API_Jun06`.
lekss361 added 1 commit 2026-06-06 19:00:13 +00:00
feat(sf): EKB geoportal urbanCard — ПЗЗ-регламент content (#1067 C8)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 5s
CI / backend-tests (push) Successful in 6m1s
CI / backend-tests (pull_request) Successful in 5m54s
5f0bd817f7
Расширение ekb_geoportal_client: рич ПЗЗ-регламент (ИРД-content для #1059).
searchByGeom (точка → ключи UrbanTerZone/GknParcel) → urbanCard (ключи → карточка) →
parse_zone_regulation → ZoneRegulation {zone_index, zone_full_name, main/conditional/
auxiliary_vri (коды 540н), limit_params (предельные параметры текстом)}. Метод
zone_regulation_at(lon,lat). Shape подтверждён live 2026-06-06 (zone Ц-1, 24 ВРИ).
Кэшировать по zone_index (регламент идентичен для всех участков зоны) — C8b (таблица).

Refs #1067 (C8). Тесты: 11 passed (parse + pipeline + empty/none ветки).
lekss361 added the
status/review
label 2026-06-06 19:00:33 +00:00
bot-reviewer reviewed 2026-06-06 19:05:41 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

Чисто аддитивное расширение C7-клиента (#1083) urbanCard-пайплайном, C7-логика не тронута (features_at_point/zone_index_at/EKBFeature/_http_get_json untouched, all расширен, 7 C7-тестов проходят без изменений):

  • Defensive parse: все обращения guard'ятся ((x or {}).get, or []). Whitespace-only urbanTerZone НЕ даёт IndexError ("".split()[0] не достигается — пустая строка falsy → index None, проверено).
  • POST httpx.post(json=body) — json-encoded, lon/lat float, без инъекций; timeout прокинут. _http_post_json module-level (мокается).
  • zone_regulation_at short-circuit'ит на нет UrbanTerZone (urbanCard не дёргается). _vri_names DRY + skip falsy. frozen+slots dataclass.
  • Нет прод-вызовов (wiring в C8b cache). 11 тестов (parse, empty, pipeline-by-URL, none-without-terzone).

Минор (advisory): int(key) в _search_keys без try/except — на нечисловом key reverse-eng API бросит ValueError. Low (нет прод-вызова). Добавлю к #1084 (тот же клиент, C8-wiring hardening) — не отдельным issue.

Merge → deploy-verify.

<!-- gendesign-review-bot: sha=5f0bd81 verdict=approve --> ✅ **APPROVE** Чисто аддитивное расширение C7-клиента (#1083) urbanCard-пайплайном, C7-логика не тронута (features_at_point/zone_index_at/EKBFeature/_http_get_json untouched, __all__ расширен, 7 C7-тестов проходят без изменений): - **Defensive parse**: все обращения guard'ятся (`(x or {}).get`, `or []`). Whitespace-only `urbanTerZone` НЕ даёт IndexError (`"".split()[0]` не достигается — пустая строка falsy → index None, проверено). - POST `httpx.post(json=body)` — json-encoded, lon/lat float, без инъекций; timeout прокинут. `_http_post_json` module-level (мокается). - `zone_regulation_at` short-circuit'ит на нет UrbanTerZone (urbanCard не дёргается). `_vri_names` DRY + skip falsy. frozen+slots dataclass. - Нет прод-вызовов (wiring в C8b cache). 11 тестов (parse, empty, pipeline-by-URL, none-without-terzone). **Минор (advisory):** `int(key)` в `_search_keys` без try/except — на нечисловом key reverse-eng API бросит ValueError. Low (нет прод-вызова). Добавлю к #1084 (тот же клиент, C8-wiring hardening) — не отдельным issue. Merge → deploy-verify.
bot-reviewer merged commit b4e6e43713 into main 2026-06-06 19:05:48 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 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#1094
No description provided.