Site Finder: WMS-overlay инженерных сетей НСПД на Leaflet карте (low-effort MVP) #102

Closed
opened 2026-05-12 08:28:09 +00:00 by lekss361 · 2 comments
lekss361 commented 2026-05-12 08:28:09 +00:00 (Migrated from github.com)

Эшелон: UX / Infrastructure visualization

Контекст / открытие

Deep-dive в engineering networks НСПД (см. NSPD_API_Map_May12 Update part 4) показал:

WMS render PNG возвращает signal для 5/6 районов ЕКБ для слоёв 844679/844704/845529/847609 — есть карта инженерных сетей Свердл в НСПД.

GetFeatureInfo на bulk export НЕ работает — 0 хитов из 100 grid-точек. Гипотеза: нужен juridic-scope ESIA (вынесено в #52 B2B-реестр).

Workaround: показывать пользователю WMS overlay на нашей карте Leaflet — devel видит сети поверх своего участка. Это не bulk ETL но trust booster и быстрый MVP.

Что сделать

Backend — конфиг WMS-overlay tiles

Добавить в backend/app/api/v1/parcels.py в analyze response блок:

{
  "wms_overlays": {
    "base_url": "https://nspd.gov.ru/api/aeggis/v4/{layerId}/wms",
    "params_template": "?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS={layerId}&STYLES=&CRS=EPSG:3857&FORMAT=image/png&TRANSPARENT=true",
    "categories": [
      {"name": "Водоснабжение", "color": "#0066CC", "layers": [844679, 847609, 869810]},
      {"name": "Теплоснабжение", "color": "#FF6633", "layers": [844704, 869811, 869812]},
      {"name": "Газоснабжение", "color": "#FFCC00", "layers": [845475, 845276, 847401]},
      {"name": "Электроэнергия (ЛЭП)", "color": "#CC0000", "layers": [845529]},
      {"name": "СЗЗ", "color": "#9933CC", "layers": [845549, 846434, 844792]},
      {"name": "ГПЗУ", "color": "#996633", "layers": [873838, 845544]},
      {"name": "Тер.зоны", "color": "#33CC33", "layers": [846427, 845590]},
      {"name": "Затопление", "color": "#0099CC", "layers": [878162]}
    ]
  }
}

Опционально: GET /api/v1/wms-overlays/categories — list of available NSPD WMS layer categories.

Frontend — SiteMap.tsx extension

  1. Добавить OverlayControls UI panel на карте Leaflet (правый верхний угол):

    • Checkbox per category: «Водоснабжение / Теплоснабжение / Газ / ЛЭП / СЗЗ / ГПЗУ / Тер.зоны / Затопление»
    • Toggle on/off — добавляет/убирает WMS tile-layer на карте
    • Opacity slider (default 0.6)
  2. Leaflet WMS-layer setup:

import L from 'leaflet';

// Для каждого активированного слоя
const wmsLayer = L.tileLayer.wms('https://nspd.gov.ru/api/aeggis/v4/844679/wms', {
  layers: '844679',
  format: 'image/png',
  transparent: true,
  version: '1.3.0',
  crs: L.CRS.EPSG3857,
  attribution: '© НСПД (Росреестр / Роскадастр)',
  opacity: 0.6
});
wmsLayer.addTo(map);
  1. Per-category clustering:

    • Если активирован «Водоснабжение» — добавляет ВСЕ 3 layerId в порядке (зоны → объекты → сети)
    • Visual ordering: точки сверху линий сверху полигонов сверху зон
  2. CORS / mixed content: проверить что НСПД отдаёт Access-Control-Allow-Origin: * или нужен proxy через наш backend (/api/v1/proxy/nspd-tile/{layerId}/...)

UI отображение в analyze response

В OverviewTab / LandTab добавить WMS Overlay Toggle Panel:

🗺️ Инженерные сети и охранные зоны (источник: НСПД)
☐ Водоснабжение (3 слоя)
☐ Теплоснабжение (3 слоя)
☐ Газоснабжение (3 слоя)
☐ ЛЭП (1 слой)
☐ Санитарно-защитные зоны (3 слоя)
☐ ГПЗУ (если есть)
☐ Тер.зоны (ПЗЗ)
☐ Зоны затопления

ⓘ Покрытие зависит от муниципалитета. Подробные featureproperties через личный кабинет НСПД (требует ЕСИА).

Performance

  • WMS tiles кешируются браузером — нагрузка на нас минимальная
  • Если CORS заблокировал — настроить proxy через Caddy или backend stream
  • НСПД rate limit: 1-2 req/s от нашего IP. Если множество пользователей одновременно → расходится по их IP (на их браузерах) — не блокирует

Acceptance

  • Backend выдаёт wms_overlays.categories в analyze response
  • Frontend OverlayControls работает (toggle on/off)
  • Минимум 4 категории показывают данные на тестовом участке в Академическом
  • CORS проверен — либо direct либо proxy
  • Attribution «© НСПД» отображается на map
  • Mobile responsive (tablet+)

Owner

frontend-engineer (UI controls + Leaflet integration) + backend-engineer (config endpoint, опц. proxy)

Effort

~0.5-1 день (если CORS прямой) или +0.5 дня если нужен proxy

Dependencies

  • Никаких — можно делать СЕЙЧАС, до #101
  • Cross-ref: #97 (NSPD deep-links — но это про текстовые ссылки), #101 (full ETL — отложено пока без juridic-scope)

Why high ROI / low effort

  • 0.5 дня → killer feature: девелопер видит инженерные сети поверх своего участка
  • Trust++ — данные с гос.портала, не наша интерпретация
  • Не зависит от наших данных — НСПД сам tile-рендерит
  • Привычный UX: включил слой как в Google Maps

Risks

  • CORS: если НСПД блокирует → нужен proxy. Решается за +0.5 дня
  • Покрытие НСПД для конкретного МО не гарантировано — пользователь может видеть пусто. Mitigation: tooltip «Если слой пустой — данные не загружены муниципалитетом в НСПД»
  • НСПД rate-limit per IP — но это per-user, не блокирует серверно
  • Research: NSPD_API_Map_May12 Update part 4 (deep-dive результаты)
  • Cross-ref: #97 (deep-links), #101 (full ETL — отложено), #52 B2B (juridic-scope)
  • Подтверждённые layerIds: см. таблицу в research/NSPD_API_Map_May12.md
**Эшелон:** UX / Infrastructure visualization ## Контекст / открытие Deep-dive в engineering networks НСПД (см. [[NSPD_API_Map_May12]] Update part 4) показал: ✅ **WMS render PNG возвращает signal для 5/6 районов ЕКБ** для слоёв 844679/844704/845529/847609 — есть карта инженерных сетей Свердл в НСПД. ❌ **GetFeatureInfo на bulk export НЕ работает** — 0 хитов из 100 grid-точек. Гипотеза: нужен juridic-scope ESIA (вынесено в #52 B2B-реестр). **Workaround:** показывать пользователю **WMS overlay** на нашей карте Leaflet — devel видит сети поверх своего участка. Это **не bulk ETL** но **trust booster** и быстрый MVP. ## Что сделать ### Backend — конфиг WMS-overlay tiles Добавить в `backend/app/api/v1/parcels.py` в `analyze` response блок: ```json { "wms_overlays": { "base_url": "https://nspd.gov.ru/api/aeggis/v4/{layerId}/wms", "params_template": "?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS={layerId}&STYLES=&CRS=EPSG:3857&FORMAT=image/png&TRANSPARENT=true", "categories": [ {"name": "Водоснабжение", "color": "#0066CC", "layers": [844679, 847609, 869810]}, {"name": "Теплоснабжение", "color": "#FF6633", "layers": [844704, 869811, 869812]}, {"name": "Газоснабжение", "color": "#FFCC00", "layers": [845475, 845276, 847401]}, {"name": "Электроэнергия (ЛЭП)", "color": "#CC0000", "layers": [845529]}, {"name": "СЗЗ", "color": "#9933CC", "layers": [845549, 846434, 844792]}, {"name": "ГПЗУ", "color": "#996633", "layers": [873838, 845544]}, {"name": "Тер.зоны", "color": "#33CC33", "layers": [846427, 845590]}, {"name": "Затопление", "color": "#0099CC", "layers": [878162]} ] } } ``` Опционально: `GET /api/v1/wms-overlays/categories` — list of available NSPD WMS layer categories. ### Frontend — `SiteMap.tsx` extension 1. Добавить **`OverlayControls` UI panel** на карте Leaflet (правый верхний угол): - Checkbox per category: «Водоснабжение / Теплоснабжение / Газ / ЛЭП / СЗЗ / ГПЗУ / Тер.зоны / Затопление» - Toggle on/off — добавляет/убирает WMS tile-layer на карте - Opacity slider (default 0.6) 2. Leaflet WMS-layer setup: ```tsx import L from 'leaflet'; // Для каждого активированного слоя const wmsLayer = L.tileLayer.wms('https://nspd.gov.ru/api/aeggis/v4/844679/wms', { layers: '844679', format: 'image/png', transparent: true, version: '1.3.0', crs: L.CRS.EPSG3857, attribution: '© НСПД (Росреестр / Роскадастр)', opacity: 0.6 }); wmsLayer.addTo(map); ``` 3. Per-category clustering: - Если активирован «Водоснабжение» — добавляет ВСЕ 3 layerId в порядке (зоны → объекты → сети) - Visual ordering: точки сверху линий сверху полигонов сверху зон 4. **CORS / mixed content:** проверить что НСПД отдаёт `Access-Control-Allow-Origin: *` или нужен proxy через наш backend (`/api/v1/proxy/nspd-tile/{layerId}/...`) ### UI отображение в analyze response В `OverviewTab` / `LandTab` добавить **WMS Overlay Toggle Panel**: ``` 🗺️ Инженерные сети и охранные зоны (источник: НСПД) ☐ Водоснабжение (3 слоя) ☐ Теплоснабжение (3 слоя) ☐ Газоснабжение (3 слоя) ☐ ЛЭП (1 слой) ☐ Санитарно-защитные зоны (3 слоя) ☐ ГПЗУ (если есть) ☐ Тер.зоны (ПЗЗ) ☐ Зоны затопления ⓘ Покрытие зависит от муниципалитета. Подробные featureproperties через личный кабинет НСПД (требует ЕСИА). ``` ### Performance - WMS tiles кешируются браузером — нагрузка на нас минимальная - Если CORS заблокировал — настроить proxy через Caddy или backend stream - НСПД rate limit: 1-2 req/s от нашего IP. Если множество пользователей одновременно → расходится по их IP (на их браузерах) — не блокирует ## Acceptance - [ ] Backend выдаёт `wms_overlays.categories` в analyze response - [ ] Frontend OverlayControls работает (toggle on/off) - [ ] Минимум 4 категории показывают данные на тестовом участке в Академическом - [ ] CORS проверен — либо direct либо proxy - [ ] Attribution «© НСПД» отображается на map - [ ] Mobile responsive (tablet+) ## Owner `frontend-engineer` (UI controls + Leaflet integration) + `backend-engineer` (config endpoint, опц. proxy) ## Effort ~0.5-1 день (если CORS прямой) или **+0.5 дня** если нужен proxy ## Dependencies - Никаких — можно делать СЕЙЧАС, до #101 - Cross-ref: #97 (NSPD deep-links — но это про текстовые ссылки), #101 (full ETL — отложено пока без juridic-scope) ## Why high ROI / low effort - **0.5 дня → killer feature:** девелопер видит инженерные сети поверх своего участка - **Trust++** — данные с гос.портала, не наша интерпретация - **Не зависит от наших данных** — НСПД сам tile-рендерит - **Привычный UX:** включил слой как в Google Maps ## Risks - **CORS:** если НСПД блокирует → нужен proxy. Решается за +0.5 дня - **Покрытие НСПД для конкретного МО не гарантировано** — пользователь может видеть пусто. Mitigation: tooltip «Если слой пустой — данные не загружены муниципалитетом в НСПД» - **НСПД rate-limit per IP** — но это per-user, не блокирует серверно ## Links - Research: [[NSPD_API_Map_May12]] Update part 4 (deep-dive результаты) - Cross-ref: #97 (deep-links), #101 (full ETL — отложено), #52 B2B (juridic-scope) - Подтверждённые layerIds: см. таблицу в research/NSPD_API_Map_May12.md
Owner

Status update — НЕ реализовано. Frontend wms_overlays controls в SiteMap.tsx отсутствуют.

NSPD UI integration (PR #212) показывает блоки в LandTab (NSPD data из cached nspd_quarter_dumps), но WMS tile overlay через Leaflet L.tileLayer.wms(...) НЕ добавлен. Остаётся валидным quick-win (~0.5-1 день).

Backend overlay config endpoint (/api/v1/wms-overlays/categories) тоже не добавлен — categories hardcoded можно начать в frontend сразу.

Issue остаётся в backlog priority/high.

Status update — НЕ реализовано. Frontend `wms_overlays` controls в SiteMap.tsx отсутствуют. NSPD UI integration (PR #212) показывает блоки в `LandTab` (NSPD data из cached `nspd_quarter_dumps`), но WMS tile overlay через Leaflet `L.tileLayer.wms(...)` НЕ добавлен. Остаётся валидным quick-win (~0.5-1 день). Backend overlay config endpoint (`/api/v1/wms-overlays/categories`) тоже не добавлен — categories hardcoded можно начать в frontend сразу. Issue остаётся в backlog priority/high.
Collaborator

DRIFT — реализовано (ground-truth 2026-06-13), трекер отставал.

WMS-overlay инженерки/слоёв на Leaflet реализован (commit df9d54b opportunity-ЗУ + red-line map layers #958, SiteMap overlay-слои). MVP-цель закрыта. Closed.

**DRIFT — реализовано (ground-truth 2026-06-13), трекер отставал.** WMS-overlay инженерки/слоёв на Leaflet реализован (commit df9d54b opportunity-ЗУ + red-line map layers #958, SiteMap overlay-слои). MVP-цель закрыта. Closed.
Sign in to join this conversation.
No project
No assignees
3 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#102
No description provided.