feat(sf): ingest ОКН-объектов ЕКБ из АИС ЕГРКН (точки+категория) → okn_objects (#1066) #1141

Merged
bot-reviewer merged 1 commit from feat/okn-objects-ingest into main 2026-06-07 12:51:19 +00:00
Owner

Что

MVP-ingest объектов-памятников ОКН ЕКБ/Свердл.обл из карты АИС ЕГРКН Минкультуры (okn-mk.mkrf.ru/Maps/searchMap, без auth). Дополняет уже собранные зоны охраны ОКН + ЗРЗ (gknspecial) самими объектами — #1066 эпика #1067.

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

  • POST searchMap, GeoJSON-точки, фильтры по категории (1=фед/2=рег/4=мест). Замеры: ЕКБ 54 фед + 213 рег, 571 по области.
  • ⚠️ coordinates [lat, lon] (Яндекс-порядок) → swap для PostGIS (тест test_coord_swap_ekb_point_inside_bbox ловит перестановку).

Состав

  • data/sql/141_okn_objects.sqlokn_objects(source_id UNIQUE, category, geom Point 4326 GIST, raw_props, …), idempotent.
  • okn_egrkn_client.py — POST searchMap (verify=True, SSL-fallback verify=False через _is_ssl_error — httpx 0.28 SSL приходит как ConnectError).
  • okn_objects_sync.py — Celery 6-pass harvest (ЕКБ+область × фед/рег/мест), дедуп source_id, beat (вс 04:30).
  • okn_lookup.pyparcel_okn_objects(db, wkt, radius_m=100) ST_DWithin, graceful.
  • 26 тестов (coord-swap, upsert-идемпотентность, lookup).

Follow-up

  • analyze-wiring parcel_okn_objects → ИРД-блок (отдельный PR).
  • Variant B — имена/статус из opendata.mkrf.ru EGROKN (атрибутивное обогащение raw_props).

Часть #1066/#1067.

## Что MVP-ingest объектов-памятников ОКН ЕКБ/Свердл.обл из карты АИС ЕГРКН Минкультуры (`okn-mk.mkrf.ru/Maps/searchMap`, без auth). Дополняет уже собранные зоны охраны ОКН + ЗРЗ (gknspecial) самими объектами — #1066 эпика #1067. ## Источник (подтверждён живыми запросами) - POST searchMap, GeoJSON-точки, фильтры по категории (1=фед/2=рег/4=мест). Замеры: ЕКБ 54 фед + 213 рег, 571 по области. - ⚠️ coordinates `[lat, lon]` (Яндекс-порядок) → swap для PostGIS (тест `test_coord_swap_ekb_point_inside_bbox` ловит перестановку). ## Состав - `data/sql/141_okn_objects.sql` — `okn_objects(source_id UNIQUE, category, geom Point 4326 GIST, raw_props, …)`, idempotent. - `okn_egrkn_client.py` — POST searchMap (verify=True, SSL-fallback verify=False через `_is_ssl_error` — httpx 0.28 SSL приходит как ConnectError). - `okn_objects_sync.py` — Celery 6-pass harvest (ЕКБ+область × фед/рег/мест), дедуп source_id, beat (вс 04:30). - `okn_lookup.py` — `parcel_okn_objects(db, wkt, radius_m=100)` ST_DWithin, graceful. - 26 тестов (coord-swap, upsert-идемпотентность, lookup). ## Follow-up - analyze-wiring `parcel_okn_objects` → ИРД-блок (отдельный PR). - Variant B — имена/статус из `opendata.mkrf.ru` EGROKN (атрибутивное обогащение raw_props). Часть #1066/#1067.
lekss361 added 1 commit 2026-06-07 12:48:57 +00:00
feat(sf): ingest ОКН-объектов ЕКБ из АИС ЕГРКН (точки+категория) → okn_objects (#1066)
All checks were successful
CI / changes (push) Successful in 6s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m21s
CI / backend-tests (pull_request) Successful in 6m16s
50ecccca4d
lekss361 added the
GG-форсайт
scope/backend
site-finder
ИРД
labels 2026-06-07 12:49:05 +00:00
bot-reviewer approved these changes 2026-06-07 12:51:07 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — ingest ОКН-объектов ЕГРКН (content-сторона #1066). Качественный ingest.

Verified prod: миграция 141_okn_objects.sql — таблица отсутствует, 141 не в _schema_migrations → один раз. Idempotent (BEGIN/COMMIT, IF NOT EXISTS, guarded UNIQUE(source_id), GIST geom).

Coord-swap корректен (mini-#1124, проверил): ЕГРКН отдаёт [lat, lon] (Яндекс) → lat=coords[0], lon=coords[1], ST_MakePoint(lon, lat) (PostGIS x=lon/y=lat). ✓ + bbox-санитайзер (55–58.5 lat / 58–63 lon) = fail-safe double-guard: при ошибочном порядке точки отсеются (пустая таблица), НЕ мислокация. Тест test_coord_swap_ekb_point_inside_bbox фиксирует.

ОК: SSL try-verify-then-fallback через _is_ssl_error (httpx 0.28 SSL→ConnectError) — robust, не dead-on-arrival; 6-pass dedup по source_id (federal-priority first-wins); SAVEPOINT per-row; CAST psycopg v3; ON CONFLICT(source_id); beat вс 04:30 (live, graceful); 26 тестов.

🟡 MINOR → follow-up (не блокеры): analyze-wiring parcel_okn_objects → ИРД-блок (смысл #1066 content-side; автор отметил отдельным PR) p2; единственный commit в конце (~571 строк — moderate, p3); vault. + Variant B (имена/статус из opendata.mkrf.ru) — отдельно.

Данные: таблица пуста (sync не прогнан) → lookup []; заполнится ручным sync_okn_objects / beat. Не сверял живьём (внешний API + пустая таблица; автор подтвердил замеры 54+213).

Merging (squash).

<!-- gendesign-review-bot: sha=50ecccc verdict=approve --> ✅ **APPROVE** — ingest ОКН-объектов ЕГРКН (content-сторона #1066). Качественный ingest. **Verified prod:** миграция `141_okn_objects.sql` — таблица отсутствует, `141` не в `_schema_migrations` → один раз. Idempotent (BEGIN/COMMIT, IF NOT EXISTS, guarded UNIQUE(source_id), GIST geom). **Coord-swap корректен (mini-#1124, проверил):** ЕГРКН отдаёт `[lat, lon]` (Яндекс) → `lat=coords[0]`, `lon=coords[1]`, `ST_MakePoint(lon, lat)` (PostGIS x=lon/y=lat). ✓ + bbox-санитайзер (55–58.5 lat / 58–63 lon) = **fail-safe double-guard**: при ошибочном порядке точки отсеются (пустая таблица), НЕ мислокация. Тест `test_coord_swap_ekb_point_inside_bbox` фиксирует. **ОК:** SSL try-verify-then-fallback через `_is_ssl_error` (httpx 0.28 SSL→ConnectError) — robust, не dead-on-arrival; 6-pass dedup по source_id (federal-priority first-wins); SAVEPOINT per-row; CAST psycopg v3; ON CONFLICT(source_id); beat вс 04:30 (live, graceful); 26 тестов. **🟡 MINOR → follow-up (не блокеры):** analyze-wiring `parcel_okn_objects` → ИРД-блок (смысл #1066 content-side; автор отметил отдельным PR) p2; единственный commit в конце (~571 строк — moderate, p3); vault. + Variant B (имена/статус из opendata.mkrf.ru) — отдельно. Данные: таблица пуста (sync не прогнан) → lookup []; заполнится ручным `sync_okn_objects` / beat. Не сверял живьём (внешний API + пустая таблица; автор подтвердил замеры 54+213). Merging (squash).
bot-reviewer merged commit 50fcba1ca0 into main 2026-06-07 12:51:19 +00:00
bot-reviewer deleted branch feat/okn-objects-ingest 2026-06-07 12:51:19 +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#1141
No description provided.