feat(tradein): ингест зданий из геопортала ЕКБ + tier в геокодере (полный кадастр города) #1786

Merged
lekss361 merged 1 commit from feat/tradein-ekb-geoportal-buildings into main 2026-06-19 14:55:43 +00:00
Owner

Зачем

НСПД cad_buildings теряет ~70% зданий ЕКБ (grid-walk лоссовый + НСПД мигрировал layer id, см. #1785). Геопортал Екатеринбурга (геопортал.екатеринбург.рф, открытый GeoServer WFS) отдаёт полные здания города — в одном малом bbox 6825 vs 34 у НСПД, и содержит дома, которых у нас нет (Космонавтов 7б и пр.). Это закрывает дыры геокода вторички из своих данных.

Что

  • 130_ekb_geoportal_buildings.sql — таблица ekb_geoportal_buildings (street/house/street_norm/house_norm/lat/lon/floors/material/purpose/source_keys, UNIQUE (street_norm,house_norm)).
  • ekb_geoportal_client.py — async WFS-клиент fetch_topo_buildings(bbox) слоя portal:portal_geo_topo_build с браузерными заголовками (без них 403), парс GeoJSON → центроид (чистый Python area-weighted, без shapely — его нет в tradein), graceful [].
  • ekb_geoportal_ingest.py (python -m) — тайлит ЕКБ на 8484 тайла 0.004°×0.003°, группирует части по (улица,дом), upsert. Тайлинг провалидирован: максимум в центре 9,324 < cap 20000 → без обрезки.
  • geocoder.py_geoportal_house_match() подключён первым локальным tier'ом (геопортал → cad_buildings → legacy ILIKE → Yandex/Nominatim, всё аддитивно).
  • Тесты: test_ekb_geoportal_ingest.py (22) + правка 2 cadastral-тестов.

Источник (верифицировано live с прода)

WFS GET /api/gis/ows/3/portal/wfs?...typeNames=portal:portal_geo_topo_build&CQL_FILTER=BBOX(geoloc,lon_min,lat_min,lon_max,lat_max); поля topo_street/topo_num_house/topo_floor/topo_material/topo_purpose + геометрия. Прод дотягивается (200 с браузерным UA/Referer).

После мержа

Деплой применит миграцию 130 → main session запустит загрузчик на проде (python -m app.tasks.ekb_geoportal_ingest, ~30-45 мин) → зальёт все здания → перепроверка дом 7б + упавших адресов.

Тесты

pytest50 passed. ruff чисто. Pre-commit green.

Связано: #1785 (анализ НСПД→геопортал).

## Зачем НСПД `cad_buildings` теряет ~70% зданий ЕКБ (grid-walk лоссовый + НСПД мигрировал layer id, см. #1785). Геопортал Екатеринбурга (`геопортал.екатеринбург.рф`, открытый GeoServer WFS) отдаёт **полные** здания города — в одном малом bbox 6825 vs 34 у НСПД, и содержит дома, которых у нас нет (Космонавтов 7б и пр.). Это закрывает дыры геокода вторички из **своих** данных. ## Что - **`130_ekb_geoportal_buildings.sql`** — таблица `ekb_geoportal_buildings` (street/house/street_norm/house_norm/lat/lon/floors/material/purpose/source_keys, UNIQUE (street_norm,house_norm)). - **`ekb_geoportal_client.py`** — async WFS-клиент `fetch_topo_buildings(bbox)` слоя `portal:portal_geo_topo_build` с браузерными заголовками (без них 403), парс GeoJSON → центроид (чистый Python area-weighted, без shapely — его нет в tradein), graceful `[]`. - **`ekb_geoportal_ingest.py`** (`python -m`) — тайлит ЕКБ на **8484 тайла 0.004°×0.003°**, группирует части по (улица,дом), upsert. Тайлинг провалидирован: максимум в центре 9,324 < cap 20000 → без обрезки. - **`geocoder.py`** — `_geoportal_house_match()` подключён **первым** локальным tier'ом (геопортал → cad_buildings → legacy ILIKE → Yandex/Nominatim, всё аддитивно). - Тесты: `test_ekb_geoportal_ingest.py` (22) + правка 2 cadastral-тестов. ## Источник (верифицировано live с прода) WFS `GET /api/gis/ows/3/portal/wfs?...typeNames=portal:portal_geo_topo_build&CQL_FILTER=BBOX(geoloc,lon_min,lat_min,lon_max,lat_max)`; поля `topo_street/topo_num_house/topo_floor/topo_material/topo_purpose` + геометрия. Прод дотягивается (200 с браузерным UA/Referer). ## После мержа Деплой применит миграцию 130 → main session запустит загрузчик на проде (`python -m app.tasks.ekb_geoportal_ingest`, ~30-45 мин) → зальёт все здания → перепроверка дом 7б + упавших адресов. ## Тесты `pytest` — **50 passed**. `ruff` чисто. Pre-commit green. Связано: #1785 (анализ НСПД→геопортал).
lekss361 added 1 commit 2026-06-19 14:54:50 +00:00
feat(tradein): EKB geoportal building ingest + geocoder tier (complete city buildings)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
64d113d649
lekss361 merged commit 84ceb9d300 into main 2026-06-19 14:55:43 +00:00
lekss361 deleted branch feat/tradein-ekb-geoportal-buildings 2026-06-19 14:55:43 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1786
No description provided.