[ИРД-10] ОКН + зоны охраны + ЗРЗ (зоны регулирования застройки) #1066

Closed
opened 2026-06-05 03:46:27 +00:00 by bot-backend · 6 comments
Collaborator

Запрос команды (Макс/Леха) 2026-06-04 для «волшебной таблицы» (= analyze/§22). Источники: ПКК pkk.rosreestr.ru, НСПД нспд.рф, portal.okn.midural.ru, приказы ПАТ.

Существующее: 🟡 PARTIAL. ОКН-объекты via ЗОУИТ 37577 + okn_territory=875840 (в каталоге); analyze.nspd_zouit_overlaps включает ОКН; gate_verdict ловит ОКН-пересечения как warning.
Пробел: зоны охраны / защитные зоны ОКН не тащатся; ЗРЗ отсутствует целиком.
Источник: НСПД «Зоны охраны / Защитные зоны ОКН» (ID — harvest #1057) + включить okn_territory 875840. ⚠️ portal.okn.midural.ru = ТОЛЬКО viewer (Yandex Maps, статичный map.png, test-режим, 0 скачиваемых geodata) — НЕ источник данных; геометрию брать из НСПД, портал — справочник для человека.
План: harvest ID зон охраны/ЗРЗ (#1057) + fetch 875840 → поля okn/okn_protection_zone/zrz + gate_verdict.
Acceptance: analyze отдаёт ОКН + зоны охраны + ЗРЗ по участку.
Связано: ЗОУИТ-стек (item 6). prereq #1057.

_Запрос команды (Макс/Леха) 2026-06-04 для «волшебной таблицы» (= analyze/§22). Источники: ПКК pkk.rosreestr.ru, НСПД нспд.рф, portal.okn.midural.ru, приказы ПАТ._ **Существующее:** 🟡 PARTIAL. ОКН-объекты via ЗОУИТ `37577` + `okn_territory=875840` (в каталоге); `analyze.nspd_zouit_overlaps` включает ОКН; `gate_verdict` ловит ОКН-пересечения как warning. **Пробел:** **зоны охраны / защитные зоны** ОКН не тащатся; **ЗРЗ** отсутствует целиком. **Источник:** НСПД «Зоны охраны / Защитные зоны ОКН» (ID — harvest #1057) + включить `okn_territory 875840`. ⚠️ **`portal.okn.midural.ru` = ТОЛЬКО viewer** (Yandex Maps, статичный map.png, test-режим, 0 скачиваемых geodata) — НЕ источник данных; **геометрию брать из НСПД**, портал — справочник для человека. **План:** harvest ID зон охраны/ЗРЗ (#1057) + fetch 875840 → поля `okn`/`okn_protection_zone`/`zrz` + gate_verdict. **Acceptance:** analyze отдаёт ОКН + зоны охраны + ЗРЗ по участку. **Связано:** ЗОУИТ-стек (item 6). prereq #1057.
bot-backend added the
scope/backend
status/ready
scrapers
ИРД
GG-форсайт
site-finder
labels 2026-06-05 03:46:27 +00:00
lekss361 added this to the Site Finder v2 — Foresight (GG-форсайт) milestone 2026-06-05 07:22:50 +00:00
Owner

🔬 Research-дополнение (2026-06-05)

Правовая база (verified)

  • ФЗ от 25.06.2002 № 73-ФЗ «Об объектах культурного наследия».
    • Ст. 34 — зоны охраны ОКН, три типа: охранная зона, зона регулирования застройки и хоз. деятельности (ЗРЗ), зона охраняемого природного ландшафта. Issue формулирует верно.
    • Ст. 34.1защитные зоны ОКН (отдельный институт, действует по умолчанию до утверждения зон охраны; границы — фиксированные отступы). Обрабатывать отдельно от зон охраны ст.34. Консультант LAW_37318 ст.34.
  • Зоны охраны и защитные зоны ОКН — это ЗОУИТ.

Источники данных (verified)

  • Подтверждаю: portal.okn.midural.ru = только viewer (Yandex Maps, статичная карта, test-режим, 0 скачиваемых geodata) — НЕ источник. Геометрию берём из НСПД. Issue прав.
  • Доп. атрибутивный источник (не viewer): Управление гос. охраны ОКН СО публикует открытые данные okn.midural.ru/opendata/ → «Перечень ОКН» (CSV) — атрибутика (имя/адрес/тип/категория/статус), без машинной геометрии. Полезно для обогащения карточки ОКН.
  • Федеральный ЕГРОКН (opendata.mkrf.ru, JSON): наименование/датировка/адрес/тип/категория — геометрии/координат полигонов и зон охраны нет (адрес текстом). Вывод: геодату зон охраны/ЗРЗ открыто не публикует ни Минкультуры, ни СО → единственный машинный геоисточник = НСПД.

Состояние в коде (verified, forgejo/main)

  • В LAYERS: zouit_okn=37577 и okn_territory=875840, оба grid-walk. Отдельного layer ID для «зон охраны/защитных зон ОКН» и для ЗРЗ в каталоге НЕТ → подтверждает пробел + prereq #1057.
  • Нюанс: НСПД ЗОУИТ-37577 может уже включать охранную зону/ЗРЗ как подтипы, но в коде cad_zouit.subcategory = 100% NULL → разделение идёт по type_zone-keywords. Часть зон охраны может уже прилетать через 37577, но не размечена — проверить на VPS, не доверять предположению.
  • analyze.nspd_zouit_overlaps + gate_verdict ловят ОКН-пересечение как warning (parcels.py:2698-2716).

Авто vs вручную

Слой Авто? Источник Метод
ОКН-объект (геометрия) НСПД 875840 + ЗОУИТ 37577 grid-walk WMS
ОКН атрибутика 🟡 okn.midural.ru/opendata CSV + ЕГРОКН JSON разовый импорт, fuzzy-джойн по адресу
зоны охраны / защитные / ЗРЗ (геометрия) нет layer ID НСПД (ID неизвестен → #1057) prereq #1057

Уточнённый DoD

  1. Блокирован #1057 — без numeric layer ID зон охраны/защитных/ЗРЗ из НСПД реализация невозможна (открытой геодаты больше нигде нет).
  2. После #1057: ID в LAYERS, overlay (data/sql/101–102), поля okn (объект), okn_protection_zone (охранная ст.34 + защитная ст.34.1), zrz.
  3. gate_verdict: охранная/защитная зона → blocker/строгий warning (стройка запрещена/жёстко ограничена ст.34); ЗРЗ → warning.
  4. Опц.: обогащение карточки ОКН названием/категорией из okn.midural.ru/opendata CSV.
  5. Verify-on-VPS: не приходят ли охранная/ЗРЗ уже частично через 37577 (subcategory/type_zone), чтобы не дублировать слой.

Effort / Risk

  • Effort: M после разблокировки (паттерн ЗОУИТ-слоёв есть). Risk: средний/высокий по данным — покрытие зон охраны/ЗРЗ в НСПД по ЕКБ может быть неполным; защитные зоны ст.34.1 могут быть «виртуальными» отступами без полигона → возможно генерация буфера от геометрии ОКН.
  • Зависимости: prereq #1057 (hard-block).

Рекомендация по label

Снять status/readyblocked/needs-prereq со ссылкой на #1057. Сейчас ready, но без layer ID воркер упрётся в неизвестный ID. Вернуть в ready после закрытия #1057 с подтверждённым ID и покрытием ЕКБ.

## 🔬 Research-дополнение (2026-06-05) ### Правовая база (verified) - **ФЗ от 25.06.2002 № 73-ФЗ** «Об объектах культурного наследия». - **Ст. 34** — зоны охраны ОКН, три типа: **охранная зона**, **зона регулирования застройки и хоз. деятельности (ЗРЗ)**, **зона охраняемого природного ландшафта**. Issue формулирует верно. - **Ст. 34.1** — **защитные зоны** ОКН (отдельный институт, действует по умолчанию до утверждения зон охраны; границы — фиксированные отступы). Обрабатывать отдельно от зон охраны ст.34. [Консультант LAW_37318 ст.34](https://www.consultant.ru/document/cons_doc_LAW_37318/12bab00129e1f67054f2ff8c4a9222f95908593d/). - Зоны охраны и защитные зоны ОКН — это **ЗОУИТ**. ### Источники данных (verified) - ✅ **Подтверждаю:** `portal.okn.midural.ru` = **только viewer** (Yandex Maps, статичная карта, test-режим, 0 скачиваемых geodata) — НЕ источник. Геометрию берём из НСПД. Issue прав. - **Доп. атрибутивный источник (не viewer):** Управление гос. охраны ОКН СО публикует **открытые данные** [okn.midural.ru/opendata/](https://okn.midural.ru/opendata/) → «Перечень ОКН» (CSV) — атрибутика (имя/адрес/тип/категория/статус), **без машинной геометрии**. Полезно для обогащения карточки ОКН. - **Федеральный ЕГРОКН** ([opendata.mkrf.ru](https://opendata.mkrf.ru/opendata/7705851331-egrkn/), JSON): наименование/датировка/адрес/тип/категория — **геометрии/координат полигонов и зон охраны нет** (адрес текстом). Вывод: **геодату зон охраны/ЗРЗ открыто не публикует ни Минкультуры, ни СО → единственный машинный геоисточник = НСПД.** ### Состояние в коде (verified, `forgejo/main`) - В `LAYERS`: `zouit_okn=37577` и `okn_territory=875840`, оба grid-walk. **Отдельного layer ID для «зон охраны/защитных зон ОКН» и для ЗРЗ в каталоге НЕТ** → подтверждает пробел + prereq #1057. - Нюанс: НСПД ЗОУИТ-`37577` может уже включать охранную зону/ЗРЗ как подтипы, но в коде `cad_zouit.subcategory` = **100% NULL** → разделение идёт по `type_zone`-keywords. **Часть зон охраны может уже прилетать через 37577, но не размечена** — проверить на VPS, не доверять предположению. - `analyze.nspd_zouit_overlaps` + `gate_verdict` ловят ОКН-пересечение как warning (`parcels.py:2698-2716`). ### Авто vs вручную | Слой | Авто? | Источник | Метод | |---|---|---|---| | ОКН-объект (геометрия) | ✅ | НСПД `875840` + ЗОУИТ `37577` | grid-walk WMS | | ОКН атрибутика | 🟡 | `okn.midural.ru/opendata` CSV + ЕГРОКН JSON | разовый импорт, fuzzy-джойн по адресу | | зоны охраны / защитные / ЗРЗ (геометрия) | ❌ нет layer ID | НСПД (ID неизвестен → #1057) | **prereq #1057** | ### Уточнённый DoD 1. **Блокирован #1057** — без numeric layer ID зон охраны/защитных/ЗРЗ из НСПД реализация невозможна (открытой геодаты больше нигде нет). 2. После #1057: ID в `LAYERS`, overlay (`data/sql/101–102`), поля `okn` (объект), `okn_protection_zone` (охранная ст.34 + защитная ст.34.1), `zrz`. 3. `gate_verdict`: охранная/защитная зона → **blocker/строгий warning** (стройка запрещена/жёстко ограничена ст.34); ЗРЗ → warning. 4. Опц.: обогащение карточки ОКН названием/категорией из `okn.midural.ru/opendata` CSV. 5. Verify-on-VPS: не приходят ли охранная/ЗРЗ уже частично через 37577 (subcategory/type_zone), чтобы не дублировать слой. ### Effort / Risk - **Effort:** M после разблокировки (паттерн ЗОУИТ-слоёв есть). **Risk:** средний/высокий по данным — покрытие зон охраны/ЗРЗ в НСПД по ЕКБ может быть неполным; защитные зоны ст.34.1 могут быть «виртуальными» отступами без полигона → возможно генерация буфера от геометрии ОКН. - **Зависимости:** **prereq #1057** (hard-block). ### Рекомендация по label **Снять `status/ready` → `blocked`/`needs-prereq` со ссылкой на #1057.** Сейчас `ready`, но без layer ID воркер упрётся в неизвестный ID. Вернуть в `ready` после закрытия #1057 с подтверждённым ID и покрытием ЕКБ.
Owner

🛰️ Зоны охраны ОКН + ЗРЗ — геопортал ЕКБ gknspecial_zone (2026-06-06, Playwright)

🟢 Охранные зоны ОКН и ЗРЗ автоматизируемы через геопортал ЕКБ WFS. ОКН-объекты (сами памятники) — отдельным источником.

Зоны охраны (geoportal, CONFIRMED)

  • Слой portal:portal_geo_gknspecial_zone (ЗОУИТ ЕГРН/ГКН, 20 251 фича). По full_name:
    • «Зона охраны объекта культурного наследия» = 355 фич
    • «Зона регулирования застройки и хозяйственной деятельности» (ЗРЗ) = 314 фич
  • Метод: INTERSECTS(geoloc, POINT(lon lat)) 4326 + CQL full_name LIKE 'Зона охраны объекта культурного наследия%' / 'Зона регулирования застройки%' + zone_state_v='Действующий'.
  • Атрибуты: full_name (тип + рег.№ 66:41-6.x), gkn_specialz_contentrestrictions (ограничения застройки/высотности), gkn_specialz_protectedobject (какой ОКН защищается), registration_date, zone_state_v. Лучше НСПД 37577 (геометрия+код).

Сами ОКН-объекты (памятники + имя + категория) — отдельно

  • portal_geo_cult_okn в геопортале = 0 фич (пуст). → ОКН-реестр (имя/категория/адрес памятника) брать из portal.okn.midural.ru (региональный реестр ОКН, источник из тела issue) либо НСПД 875840 (территории ОКН, геометрия). Зоны охраны (выше) ≠ объекты ОКН.

Pipeline: охранные зоны/ЗРЗ → geoportal gknspecial_zone (🟢); ОКН-объекты/имена → okn.midural.ru / НСПД (🟡). Feasibility зон охраны 🟢 → status/ready (часть «зоны охраны + ЗРЗ»); ОКН-объекты — под-задача.

Разведка: vault research/EKB_Geoportal_IRD_Layers_KRT_Genplan_Reserve_Jun06.

## 🛰️ Зоны охраны ОКН + ЗРЗ — геопортал ЕКБ `gknspecial_zone` (2026-06-06, Playwright) **🟢 Охранные зоны ОКН и ЗРЗ автоматизируемы через геопортал ЕКБ WFS.** ОКН-объекты (сами памятники) — отдельным источником. ### Зоны охраны (geoportal, CONFIRMED) - **Слой `portal:portal_geo_gknspecial_zone`** (ЗОУИТ ЕГРН/ГКН, 20 251 фича). По `full_name`: - **«Зона охраны объекта культурного наследия» = 355 фич** ✅ - **«Зона регулирования застройки и хозяйственной деятельности» (ЗРЗ) = 314 фич** ✅ - **Метод:** `INTERSECTS(geoloc, POINT(lon lat))` 4326 + CQL `full_name LIKE 'Зона охраны объекта культурного наследия%'` / `'Зона регулирования застройки%'` + `zone_state_v='Действующий'`. - **Атрибуты:** `full_name` (тип + рег.№ `66:41-6.x`), `gkn_specialz_contentrestrictions` (ограничения застройки/высотности), `gkn_specialz_protectedobject` (какой ОКН защищается), `registration_date`, `zone_state_v`. Лучше НСПД 37577 (геометрия+код). ### Сами ОКН-объекты (памятники + имя + категория) — отдельно - `portal_geo_cult_okn` в геопортале = **0 фич** (пуст). → ОКН-реестр (имя/категория/адрес памятника) брать из **portal.okn.midural.ru** (региональный реестр ОКН, источник из тела issue) либо НСПД 875840 (территории ОКН, геометрия). Зоны охраны (выше) ≠ объекты ОКН. **Pipeline:** охранные зоны/ЗРЗ → geoportal `gknspecial_zone` (🟢); ОКН-объекты/имена → okn.midural.ru / НСПД (🟡). Feasibility зон охраны **🟢 → status/ready** (часть «зоны охраны + ЗРЗ»); ОКН-объекты — под-задача. _Разведка: vault `research/EKB_Geoportal_IRD_Layers_KRT_Genplan_Reserve_Jun06`._
Owner

Частично закрыто merged-работой; остаток заблокирован на #1057.

Готово (за флагом enable_ird_analyze): ОКН-объекты — zouit_okn (НСПД 37577) + okn_territory (875840) тащатся ird_harvest (#1090) в ird_overlaysird.ird_overlaps (#1101). Acceptance в части «ОКН по участку» закрыт.

Остаток (НЕ автономно сейчас): «зоны охраны / защитные зоны ОКН» + «ЗРЗ» — это ОТДЕЛЬНЫЕ НСПД-слои, которых нет в nspd_client.LAYERS. Нужны их layer-ID (harvest-discovery #1057). Как только ID известны — добавляются в IRD_HARVEST_LAYER_KEYS тривиально (паттерн #1086 ККР). → needs-human: prereq #1057 (layer-ID discovery) либо подтвердить, что ОКН-overlap достаточно для MVP.

Частично закрыто merged-работой; остаток заблокирован на #1057. **Готово (за флагом `enable_ird_analyze`):** ОКН-объекты — `zouit_okn` (НСПД 37577) + `okn_territory` (875840) тащатся `ird_harvest` (#1090) в `ird_overlays` → `ird.ird_overlaps` (#1101). Acceptance в части «ОКН по участку» закрыт. **Остаток (НЕ автономно сейчас):** «зоны охраны / защитные зоны ОКН» + «ЗРЗ» — это ОТДЕЛЬНЫЕ НСПД-слои, которых нет в `nspd_client.LAYERS`. Нужны их layer-ID (harvest-discovery #1057). Как только ID известны — добавляются в `IRD_HARVEST_LAYER_KEYS` тривиально (паттерн #1086 ККР). → `needs-human`: prereq #1057 (layer-ID discovery) либо подтвердить, что ОКН-overlap достаточно для MVP.
lekss361 added
needs-human
and removed
status/ready
labels 2026-06-06 20:56:40 +00:00
Owner

ОКН-объекты — источник найден 🟢 (research 2026-06-07)

Зоны охраны ОКН + ЗРЗ этого пункта уже собраны (gknspecial: okn_protection_zone 313 + zrz 307). Не хватало объектов-памятников — источник подтверждён живыми запросами:

A. okn-mk.mkrf.ru/Maps/searchMap (карта АИС ЕГРКН, без auth/капчи):

  • POST form-urlencoded (jQuery serializeArray), фильтры CultureObjects[cob_address], [cob_category_type] (1=фед/2=рег/4=мест), [cob_object_type].
  • Ответ GeoJSON FeatureCollection, coordinates:[lat,lon] (⚠️ Яндекс-порядок, swap для PostGIS).
  • Замерено живьём: 272 точки ЕКБ (54 фед + 213 рег), 571 по «Свердловская». Имена/рег.№ за LoginRequired (балун) → отсюда только id+координаты+категория.

B. opendata.mkrf.ru EGROKN (bulk, канонический, обновлён 2026-06-07):

  • data-NN-structure-16.json.zip (~270MB, ~146k РФ). Поля: general.name/regNumber/categoryType/typologies/status/address(+ФИАС)/mapPosition, coordinates "lat,long". Фильтр по general.region=Свердл.обл. Идемпотент по regNumber, refresh по meta.json.modified.

План: MVP = A (точки+категория, лёгкий, для флага «участок содержит/рядом ОКН») → PostGIS точки → ST_DWithin к участку. Richer follow-up = B (имена/статус из opendata). Археология координаты закрыты (приказ №2328) — для архитектуры/истории не помеха.

→ Снимаю needs-human, беру MVP-ingest (Variant A). Объекты-памятники + уже собранные зоны охраны = полный ОКН #1066.

## ОКН-объекты — источник найден 🟢 (research 2026-06-07) Зоны охраны ОКН + ЗРЗ этого пункта **уже собраны** (gknspecial: okn_protection_zone 313 + zrz 307). Не хватало **объектов-памятников** — источник подтверждён живыми запросами: **A. `okn-mk.mkrf.ru/Maps/searchMap`** (карта АИС ЕГРКН, без auth/капчи): - `POST` form-urlencoded (jQuery serializeArray), фильтры `CultureObjects[cob_address]`, `[cob_category_type]` (1=фед/2=рег/4=мест), `[cob_object_type]`. - Ответ GeoJSON FeatureCollection, `coordinates:[lat,lon]` (⚠️ Яндекс-порядок, swap для PostGIS). - Замерено живьём: **272 точки** ЕКБ (54 фед + 213 рег), 571 по «Свердловская». Имена/рег.№ за `LoginRequired` (балун) → отсюда только id+координаты+категория. **B. `opendata.mkrf.ru` EGROKN** (bulk, канонический, обновлён 2026-06-07): - `data-NN-structure-16.json.zip` (~270MB, ~146k РФ). Поля: `general.name/regNumber/categoryType/typologies/status/address(+ФИАС)/mapPosition`, `coordinates "lat,long"`. Фильтр по `general.region`=Свердл.обл. Идемпотент по regNumber, refresh по meta.json.modified. **План:** MVP = A (точки+категория, лёгкий, для флага «участок содержит/рядом ОКН») → PostGIS точки → ST_DWithin к участку. Richer follow-up = B (имена/статус из opendata). Археология координаты закрыты (приказ №2328) — для архитектуры/истории не помеха. → Снимаю needs-human, беру MVP-ingest (Variant A). Объекты-памятники + уже собранные зоны охраны = полный ОКН #1066.
lekss361 removed the
needs-human
label 2026-06-07 12:38:10 +00:00
Owner

⚠️ Прод-прогон sync_okn_objects вернул 0 (#1141 смерджен+задеплоен). Диагностика curl с прод-сервера: POST okn-mk.mkrf.ru/Maps/searchMapHTTP 403 Forbidden. Research-агент проверял через браузер (RU-context Playwright) — там работало; plain httpx без браузерных заголовков/сессии блокируется анти-ботом.

Follow-up fix (на выбор):

  1. Добавить браузерные заголовки в okn_egrkn_client: X-Requested-With: XMLHttpRequest, Referer: https://okn-mk.mkrf.ru/..., Origin, реалистичный User-Agent, при необходимости — прогрев cookie/CSRF (GET карты → cookie → POST). Проверить через playwright какие именно заголовки нужны.
  2. Перейти на Variant Bopendata.mkrf.ru EGROKN bulk zip (статический файл, анти-бот маловероятен) — заодно даёт имена/категории/статус (richer). Рекомендую как основной.

Код таблицы/lookup/sync работает (26 тестов), блокер только в живом fetch источника А. Зоны охраны ОКН+ЗРЗ этого пункта уже на проде (gknspecial). Возвращаю на доработку fetch-слоя.

⚠️ **Прод-прогон `sync_okn_objects` вернул 0** (#1141 смерджен+задеплоен). Диагностика curl с прод-сервера: `POST okn-mk.mkrf.ru/Maps/searchMap` → **HTTP 403 Forbidden**. Research-агент проверял через браузер (RU-context Playwright) — там работало; plain httpx без браузерных заголовков/сессии блокируется анти-ботом. **Follow-up fix (на выбор):** 1. Добавить браузерные заголовки в `okn_egrkn_client`: `X-Requested-With: XMLHttpRequest`, `Referer: https://okn-mk.mkrf.ru/...`, `Origin`, реалистичный `User-Agent`, при необходимости — прогрев cookie/CSRF (GET карты → cookie → POST). Проверить через playwright какие именно заголовки нужны. 2. **Перейти на Variant B** — `opendata.mkrf.ru` EGROKN bulk zip (статический файл, анти-бот маловероятен) — заодно даёт имена/категории/статус (richer). Рекомендую как основной. Код таблицы/lookup/sync работает (26 тестов), блокер только в живом fetch источника А. Зоны охраны ОКН+ЗРЗ этого пункта уже на проде (gknspecial). Возвращаю на доработку fetch-слоя.
Owner

403 решён (research 2026-06-07) — это был чисто User-Agent блок 🟢

POST okn-mk.mkrf.ru/Maps/searchMap без браузерного UA → 403 (nginx режет голый httpx/curl). С реальным User-Agent200, проверено: cob_address=Екатеринбург → ровно 272 фичи, «Свердловская» → 571. Cookie/CSRF НЕ нужны (публичный поиск).

Минимальный фикс — добавить в okn_egrkn_client httpx-заголовки:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... Chrome/125 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: https://okn-mk.mkrf.ru/Maps
Origin: https://okn-mk.mkrf.ru

UA — load-bearing (даже GET / даёт 403 без UA). Coordinates [lat,lon] (наш swap уже есть).

Беру в работу (one-line fixup). Enrichment-follow-up: opendata.mkrf bulk (167MB, имена/категории) — но координаты лишь у 39% Свердл.записей → только для атрибутов по nativeId, не как гео.

## 403 решён (research 2026-06-07) — это был чисто User-Agent блок 🟢 `POST okn-mk.mkrf.ru/Maps/searchMap` без браузерного UA → 403 (nginx режет голый httpx/curl). С реальным `User-Agent` → **200**, проверено: `cob_address=Екатеринбург` → ровно **272** фичи, «Свердловская» → 571. **Cookie/CSRF НЕ нужны** (публичный поиск). **Минимальный фикс — добавить в `okn_egrkn_client` httpx-заголовки:** ``` User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... Chrome/125 Safari/537.36 X-Requested-With: XMLHttpRequest Referer: https://okn-mk.mkrf.ru/Maps Origin: https://okn-mk.mkrf.ru ``` UA — load-bearing (даже GET `/` даёт 403 без UA). Coordinates `[lat,lon]` (наш swap уже есть). Беру в работу (one-line fixup). Enrichment-follow-up: opendata.mkrf bulk (167MB, имена/категории) — но координаты лишь у 39% Свердл.записей → только для атрибутов по nativeId, не как гео.
Sign in to join this conversation.
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#1066
No description provided.