[ИРД][prereq] Собрать NSPD layer-tree ID для новых ИРД-слоёв (функц.зоны/КРТ/резервирование/ПАТ/зоны охраны ОКН) #1057

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

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

Зачем

5 ИРД-пунктов (1 ГП, 3 КРТ, 5 резервирование, 9 ПАТ, 10 зоны охраны ОКН) обслуживаются НСПД, но их numeric layer ID неизвестны, а НСПД (nspd.gov.ru, нспд.рф) гео-блокирует не-РФ IP (TLS timeout). Публичных доков с ID нет — ID надо снять эмпирически с VPS.

НСПД-клиент (backend/app/services/scrapers/nspd_client.pyLAYERS dict + point_feature_info(layer_id, lon, lat) + get_features_in_bbox_grid) тащит любой слой по numeric ID одной строкой. EPSG:3857→ST_Transform(...,4326). Overlay-таблицы — data/sql/101–102.

Что сделать (с VPS / Beget)

  1. GET https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree (verify=False, как в текущем клиенте).
  2. Найти ID для слоёв: функциональные зоны / документы террит. планирования (ГП), комплексное развитие территорий (КРТ), зоны резервирования / решения об изъятии, приаэродромные территории (ПАТ), зоны охраны / защитные зоны ОКН.
  3. Для каждого проверить покрытие ЕКБ/Свердл (GetFeatureInfo по тест-точке) — НЕ пусто ли.
  4. Добавить найденные ID в LAYERS + задокументировать покрытие (особенно ЕКБ для КРТ/резервирования/ПАТ — внешний агент флагнул риск пустоты).

Acceptance

Таблица «ИРД-пункт → НСПД layer ID → покрытие ЕКБ (есть/пусто)». Блокирует #ИРД-1/3/5/9/10.

Уже зашитые ID (reuse): territorial_zones(ПЗЗ) 875838, ЗОУИТ 37577–37581, ООПТ 875845, лесничества 875866, okn_territory 875840.

_Запрос команды (Макс/Леха) 2026-06-04 для «волшебной таблицы» (= analyze/§22). Источники: ПКК pkk.rosreestr.ru, НСПД нспд.рф, portal.okn.midural.ru, приказы ПАТ._ ## Зачем 5 ИРД-пунктов (1 ГП, 3 КРТ, 5 резервирование, 9 ПАТ, 10 зоны охраны ОКН) обслуживаются НСПД, но их **numeric layer ID неизвестны**, а НСПД (`nspd.gov.ru`, `нспд.рф`) **гео-блокирует не-РФ IP** (TLS timeout). Публичных доков с ID нет — ID надо снять эмпирически **с VPS**. НСПД-клиент (`backend/app/services/scrapers/nspd_client.py` — `LAYERS` dict + `point_feature_info(layer_id, lon, lat)` + `get_features_in_bbox_grid`) тащит любой слой по numeric ID одной строкой. EPSG:3857→`ST_Transform(...,4326)`. Overlay-таблицы — `data/sql/101–102`. ## Что сделать (с VPS / Beget) 1. `GET https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree` (verify=False, как в текущем клиенте). 2. Найти ID для слоёв: **функциональные зоны / документы террит. планирования** (ГП), **комплексное развитие территорий (КРТ)**, **зоны резервирования / решения об изъятии**, **приаэродромные территории (ПАТ)**, **зоны охраны / защитные зоны ОКН**. 3. Для каждого проверить покрытие ЕКБ/Свердл (GetFeatureInfo по тест-точке) — НЕ пусто ли. 4. Добавить найденные ID в `LAYERS` + задокументировать покрытие (особенно ЕКБ для КРТ/резервирования/ПАТ — внешний агент флагнул риск пустоты). ## Acceptance Таблица «ИРД-пункт → НСПД layer ID → покрытие ЕКБ (есть/пусто)». Блокирует #ИРД-1/3/5/9/10. Уже зашитые ID (reuse): territorial_zones(ПЗЗ) `875838`, ЗОУИТ `37577–37581`, ООПТ `875845`, лесничества `875866`, okn_territory `875840`.
bot-backend added the
scope/backend
ИРД
scrapers
status/ready
GG-форсайт
site-finder
labels 2026-06-05 03:46:18 +00:00
lekss361 added this to the Site Finder v2 — Foresight (GG-форсайт) milestone 2026-06-05 07:22:41 +00:00
Owner

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

Инфра подтверждена (read-only forgejo/main)

  • nspd_client.py: LAYERS dict, get_feature_info(layer_id, lon, lat) (= point_feature_info в теле issue — реальное имя метода get_feature_info), get_features_in_bbox_grid, list_layers(theme_id).
  • Harvest-эндпоинт уже зашит: NSPD_LAYERS_TREE = "https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree", list_layers() дёргает ?themeId={N} и проходит дерево walker'ом (_walk_layer_tree) → leaf-слои. Т.е. шаг 1 acceptance уже имеет готовый код — harvest = вызвать list_layers(...) с VPS и снять title→id.
  • Все «уже зашитые» ID из issue подтверждены в коде 1:1: territorial_zones 875838, ЗОУИТ 37577/37578/37579/37580/37581, protected_areas 875845, forestries 875866, okn_territory 875840.

Гео-блок подтверждён эмпирически

Прямой запрос https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree с не-РФ хоста → обрыв соединения на стадии connect (×2). Подтверждает claim «TLS timeout с не-РФ IP» → harvest без РФ-IP (VPS/Beget) невозможен.

Формат WMS-слоя подтверждён внешним источником

Форум SAS.Planet: рабочий URL https://nspd.gov.ru/api/aeggis/v3/{layerId}/wms?...&LAYERS={layerId}&CRS=EPSG:3857, где 36048 = «Земельные участки из ЕГРН» — совпадает с LAYERS["parcels"]: 36048 в коде. Numeric-layerId схема, на которой построен клиент, реальна (independent verification одного из ID). Источник: https://www.sasgis.org/forum/viewtopic.php?f=56&t=3575&start=50

Numeric ID для 5 искомых слоёв — НЕ найдено публично

Проверены nspd.gov.ru (блок), GitHub rendrom/rosreestr2coord, yasg1988/mcp-rosreestr, форумы sasgis/geodesist, habr. Ни один источник не публикует geoportal layerId для функц.зон / КРТ / резервирования / ПАТ / зон охраны ОКН.
⚠️ Ловушка: оба GitHub-репо оперируют кодами area_type 1/2/4/5/7/15 — это таксономия search-API (/geoportal/v2/search), НЕ WMS-layerId. Не подставлять их в LAYERS — другой неймспейс.

Вывод

→ функц.зоны / КРТ / резервирование / ПАТ / зоны охраны ОКН: не найдено публично → harvest с VPS обязателен. Спек actionable, но by-design остаётся blocked на VPS-harvest. Рекомендую acceptance-таблицу заполнять прямо выводом list_layers(...) (title-regex по «функциональн», «комплексн», «резерв», «приаэродром», «охран»), а не угадывать ID.
⚠️ Частичная редундантность: для п.1 (ГП функц.зоны) layer ID 846615 уже известен из #106 (100% покрытие ЕКБ) — см. комментарий в #1058. Т.е. harvest нужен по факту для 4 слоёв (КРТ/резервирование/ПАТ/зоны охраны ОКН), не 5.

## 🔬 Research-дополнение (2026-06-05) ### Инфра подтверждена (read-only `forgejo/main`) - `nspd_client.py`: `LAYERS` dict, `get_feature_info(layer_id, lon, lat)` (= `point_feature_info` в теле issue — реальное имя метода `get_feature_info`), `get_features_in_bbox_grid`, `list_layers(theme_id)`. - Harvest-эндпоинт уже зашит: `NSPD_LAYERS_TREE = "https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree"`, `list_layers()` дёргает `?themeId={N}` и проходит дерево walker'ом (`_walk_layer_tree`) → leaf-слои. Т.е. шаг 1 acceptance уже имеет готовый код — harvest = вызвать `list_layers(...)` с VPS и снять title→id. - Все «уже зашитые» ID из issue подтверждены в коде 1:1: `territorial_zones 875838`, ЗОУИТ `37577/37578/37579/37580/37581`, `protected_areas 875845`, `forestries 875866`, `okn_territory 875840`. ✅ ### Гео-блок подтверждён эмпирически Прямой запрос `https://nspd.gov.ru/api/geoportal/v1/layers-theme-tree` с не-РФ хоста → обрыв соединения на стадии connect (×2). Подтверждает claim «TLS timeout с не-РФ IP» → **harvest без РФ-IP (VPS/Beget) невозможен**. ### Формат WMS-слоя подтверждён внешним источником Форум SAS.Planet: рабочий URL `https://nspd.gov.ru/api/aeggis/v3/{layerId}/wms?...&LAYERS={layerId}&CRS=EPSG:3857`, где **`36048` = «Земельные участки из ЕГРН»** — совпадает с `LAYERS["parcels"]: 36048` в коде. Numeric-`layerId` схема, на которой построен клиент, реальна (independent verification одного из ID). Источник: https://www.sasgis.org/forum/viewtopic.php?f=56&t=3575&start=50 ### Numeric ID для 5 искомых слоёв — НЕ найдено публично Проверены nspd.gov.ru (блок), GitHub `rendrom/rosreestr2coord`, `yasg1988/mcp-rosreestr`, форумы sasgis/geodesist, habr. **Ни один источник не публикует geoportal `layerId` для функц.зон / КРТ / резервирования / ПАТ / зон охраны ОКН.** ⚠️ Ловушка: оба GitHub-репо оперируют кодами `area_type` **1/2/4/5/7/15** — это таксономия **search-API** (`/geoportal/v2/search`), НЕ WMS-`layerId`. Не подставлять их в `LAYERS` — другой неймспейс. ### Вывод → функц.зоны / КРТ / резервирование / ПАТ / зоны охраны ОКН: **не найдено публично → harvest с VPS обязателен**. Спек actionable, но by-design остаётся blocked на VPS-harvest. Рекомендую acceptance-таблицу заполнять прямо выводом `list_layers(...)` (title-regex по «функциональн», «комплексн», «резерв», «приаэродром», «охран»), а не угадывать ID. ⚠️ Частичная редундантность: для п.1 (ГП функц.зоны) layer ID **846615 уже известен** из #106 (100% покрытие ЕКБ) — см. комментарий в #1058. Т.е. harvest нужен по факту для 4 слоёв (КРТ/резервирование/ПАТ/зоны охраны ОКН), не 5.
Owner

Harvest выполнен с VPS (gendesign-backend-1, RU IP) — 2026-06-06

Главное: VPS-IP НЕ геоблокирован. layers-theme-tree + WMS GetFeatureInfo отрабатывают штатно (37577/875840/37581 вернули фичи по тест-точке ЕКБ пл.1905 lon=60.5975 lat=56.8389). Значит проблема была не в IP, а в гипотезе «ID есть, но не опубликованы».

Снят полный каталог НСПД (layers-theme-tree, все темы)

Тема 1 (ПКК) = 63 слоя, тема 665 (аналитика рынка) = 6, темы 516/566/571/642 — нерелевантны. Полный flat-список в d["layers"] (не в tree-категориях — отсюда list_layers() walker возвращал 0, см. ниже баг).

4 из 5 целевых слоёв В НСПД-ДЕРЕВЕ ОТСУТСТВУЮТ (не harvest-проблема — их там нет)

ИРД-пункт Искали Факт в НСПД
1 ГП функц.зоны (#1058) «функциональные зоны» нет слоя. Только 875838 Территориальные зоны (ПЗЗ, уже зашит). Генплан-зоны → ФГИС ТП, не НСПД
3 КРТ (#1060) «комплексное развитие территорий» нет. Есть 37430 Территории комплексных кадастровых работ — это ККР, ДРУГОЕ
5 Резервирование/изъятие (#1062) «резервирование», «изъятие» нет слоя ни в одной теме
9 ПАТ (#1065) «приаэродром», «аэродром» нет слоя
10 Зоны охраны ОКН (#1066) зоны охраны/ЗРЗ ОКН покрыто существующими: 37577 ЗОУИТ ОКН + 875840 территории ОКНоба зашиты, по ЕКБ возвращают фичи (descr=66:41-6.4125, 66:41-8.303)

Проверка покрытия ЕКБ (GetFeatureInfo, buffer 150м, центр)

  • 37577 ЗОУИТ ОКН → 1 feat · 875840 территории ОКН → 1 feat · 37581 иные ЗОУИТ (вкл. публичный сервитут) → 2 feat
  • 875838 ПЗЗ, 875845 ООПТ, 37430 ККР → 0 feat по точке центра (single-pixel WMS; для зон нужен grid-walk / точка вне зоны — НЕ значит «пусто по ЕКБ», для ООПТ центр города ожидаемо пуст).

Вывод для эпика #1067

  • #1057 закрывается без добавления ID в LAYERS — новых НСПД-слоёв для пунктов 1/3/5/9 нет. Гипотеза «ID не опубликованы» опровергнута.
  • Пункты 1/3/5/9 НЕ автоматизируются через НСПД. Альтернативные источники (как и флагнул сам эпик): функц.зоны → ФГИС ТП; КРТ/резервирование → ИСОГД ЕКБ по запросу; ПАТ → manual оцифровка приказов. → переразметить #1058/#1060/#1062/#1065 как needs-human / re-scope, снять блок-зависимость от #1057.
  • Разблокированы и готовы к работе на существующих ID: #1059 ПЗЗ (875838), #1063 сервитуты (37581), #1064 ООПТ/леса/вода (875845/875866/37580), #1066 ОКН (37577/875840).

🐛 Побочно найден баг

NSPDClient.list_layers() парсит children-tree, но НСПД отдаёт {"layers":[...], "tree":...} с плоским списком в layers (поля layerId/title/layerName). Сейчас list_layers() возвращает [] для любой темы. Не критично (overlay-слои зашиты вручную), но стоит починить отдельным мелким PR если list_layers где-то используется.

## Harvest выполнен с VPS (gendesign-backend-1, RU IP) — 2026-06-06 **Главное: VPS-IP НЕ геоблокирован.** `layers-theme-tree` + WMS GetFeatureInfo отрабатывают штатно (37577/875840/37581 вернули фичи по тест-точке ЕКБ пл.1905 lon=60.5975 lat=56.8389). Значит проблема была не в IP, а в гипотезе «ID есть, но не опубликованы». ### Снят полный каталог НСПД (`layers-theme-tree`, все темы) Тема 1 (ПКК) = **63 слоя**, тема 665 (аналитика рынка) = 6, темы 516/566/571/642 — нерелевантны. Полный flat-список в `d["layers"]` (не в `tree`-категориях — отсюда `list_layers()` walker возвращал 0, см. ниже баг). ### ❌ 4 из 5 целевых слоёв В НСПД-ДЕРЕВЕ ОТСУТСТВУЮТ (не harvest-проблема — их там нет) | ИРД-пункт | Искали | Факт в НСПД | |---|---|---| | 1 ГП функц.зоны (#1058) | «функциональные зоны» | **нет слоя.** Только `875838 Территориальные зоны` (ПЗЗ, уже зашит). Генплан-зоны → ФГИС ТП, не НСПД | | 3 КРТ (#1060) | «комплексное развитие территорий» | **нет.** Есть `37430 Территории комплексных кадастровых работ` — это ККР, ДРУГОЕ | | 5 Резервирование/изъятие (#1062) | «резервирование», «изъятие» | **нет слоя** ни в одной теме | | 9 ПАТ (#1065) | «приаэродром», «аэродром» | **нет слоя** | | 10 Зоны охраны ОКН (#1066) | зоны охраны/ЗРЗ ОКН | ✅ покрыто существующими: `37577 ЗОУИТ ОКН` + `875840 территории ОКН` — **оба зашиты**, по ЕКБ возвращают фичи (`descr=66:41-6.4125`, `66:41-8.303`) | ### ✅ Проверка покрытия ЕКБ (GetFeatureInfo, buffer 150м, центр) - `37577` ЗОУИТ ОКН → 1 feat ✅ · `875840` территории ОКН → 1 feat ✅ · `37581` иные ЗОУИТ (вкл. публичный сервитут) → 2 feat ✅ - `875838` ПЗЗ, `875845` ООПТ, `37430` ККР → 0 feat по точке центра (single-pixel WMS; для зон нужен grid-walk / точка вне зоны — НЕ значит «пусто по ЕКБ», для ООПТ центр города ожидаемо пуст). ### Вывод для эпика #1067 - **#1057 закрывается без добавления ID в `LAYERS`** — новых НСПД-слоёв для пунктов 1/3/5/9 нет. Гипотеза «ID не опубликованы» опровергнута. - **Пункты 1/3/5/9 НЕ автоматизируются через НСПД.** Альтернативные источники (как и флагнул сам эпик): функц.зоны → ФГИС ТП; КРТ/резервирование → ИСОГД ЕКБ по запросу; ПАТ → manual оцифровка приказов. → переразметить #1058/#1060/#1062/#1065 как `needs-human` / re-scope, снять блок-зависимость от #1057. - **Разблокированы и готовы к работе на существующих ID:** #1059 ПЗЗ (`875838`), #1063 сервитуты (`37581`), #1064 ООПТ/леса/вода (`875845/875866/37580`), #1066 ОКН (`37577/875840`). ### 🐛 Побочно найден баг `NSPDClient.list_layers()` парсит `children`-tree, но НСПД отдаёт `{"layers":[...], "tree":...}` с плоским списком в `layers` (поля `layerId`/`title`/`layerName`). Сейчас `list_layers()` возвращает `[]` для любой темы. Не критично (overlay-слои зашиты вручную), но стоит починить отдельным мелким PR если `list_layers` где-то используется.
Owner

Закрываю — harvest выполнен (см. коммент выше). Итог: НСПД-каталог снят (63 слоя темы 1), целевых слоёв для пунктов 1/3/5/9 в дереве НСПД нет → добавлять ID в LAYERS нечего, гипотеза «ID не опубликованы» опровергнута. Acceptance (таблица пункт→слой→покрытие) закрыт. Зависимые задачи разблокированы/переразмечены отдельно (см. #1067). VPS-IP не геоблокирован — НСПД-ингест можно делать с gendesign-backend-1.

Закрываю — harvest выполнен (см. коммент выше). Итог: НСПД-каталог снят (63 слоя темы 1), целевых слоёв для пунктов 1/3/5/9 в дереве НСПД нет → **добавлять ID в `LAYERS` нечего**, гипотеза «ID не опубликованы» опровергнута. Acceptance (таблица пункт→слой→покрытие) закрыт. Зависимые задачи разблокированы/переразмечены отдельно (см. #1067). VPS-IP не геоблокирован — НСПД-ингест можно делать с `gendesign-backend-1`.
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#1057
No description provided.