feat(#232): ЗОУИТ visual layer на Leaflet карте — схематичные полигоны охранных зон (требование Макса) #255

Closed
opened 2026-05-17 06:29:00 +00:00 by lekss361 · 0 comments
Owner

Контекст / требование Макса

Сейчас на /site-finder ЗОУИТ overlaps показаны только в text list под картой:

Зоны с особыми условиями использования (ЗОУИТ)
[INFO] cad_zouit  Охранная зона тепловой сети с кад. № 66:41:0204016:57
[INFO] cad_zouit  Охранная зона тепловой сети ...
[INFO] cad_zouit  Публичный сервитут в целях размещения тепловой сети ...

Макс хочет визуально на карте — схематичные полигоны overlay'ом, чтобы видеть где именно находятся охранные зоны относительно участка.

Что есть в БД

cad_zouit table (3 483 строки):

  • geom GEOGRAPHY(POLYGON, 4326) — реальная геометрия охранных зон
  • type_zone — категория (охранная зона тепловой сети / СЗЗ / зона публичного сервитута / охранная зона трубопровода / электроэнергетики / газа / связи)
  • category_name — группа (ЗОУИТ general / энергетика-связь-транспорт / иные)
  • name — полное описание
  • GIST index cad_zouit_geom_gist

API: после PR #248 /analyze возвращает nspd_zouit_overlaps со всеми пересечениями (radius 200m по умолчанию), но без geometry — только textual fields.

Что нужно

Backend (small extension)

В quarter_dump_lookup._get_cad_zouit_overlaps добавить в return geom_geojson field:

SELECT type_zone, category_name, name, category_id, zouit_id,
       ST_AsGeoJSON(geom::geometry) AS geom_geojson
FROM cad_zouit WHERE ST_Intersects(geom, :parcel_wkt)

Каждый overlap dict теперь содержит geom_geojson (string).

Frontend

  1. TS type extensionNspdZouitOverlap добавить geom_geojson?: string
  2. Component frontend/src/components/site-finder/ZouitLayer.tsx:
    • Принимать overlaps: NspdZouitOverlap[] + visibleCategories: Set<ZouitCategory>
    • Для каждого overlap: JSON.parse(geom_geojson)<GeoJSON> (react-leaflet) с стилизацией
    • Стиль per category:
      • 🟥 blocker (охранная зона трубопровода/электр/газа) — красная заливка, opacity 0.3
      • 🟧 warning (СЗЗ, охранная зона тепла) — оранжевая заливка
      • 🟦 info (зона сервитута) — синяя заливка
    • Click на полигон → popup с name + type_zone + source
  3. Layer control panel ZouitLayerControlPanel.tsx (аналог CpLayerControlPanel):
    • Checkbox per-категория (blocker/warning/info) с цветным dot + count
    • Collapsible
  4. Integrate в SiteMap.tsx — рендерить <ZouitLayer> поверх остальных слоёв с toggle
  5. page.tsx — после analyze response передавать data.nspd_zouit_overlaps в SiteMap

Tests

  • Backend: pytest для _get_cad_zouit_overlaps — verify geom_geojson field присутствует
  • Frontend: tsc/lint clean, playwright smoke на /site-finder с cad имеющим ЗОУИТ overlaps → screenshot карты с полигонами

Acceptance

  • На /site-finder для cad 66:41:0204016:10 ЗОУИТ полигоны видны на карте (минимум охранная зона тепловой сети)
  • Layer toggle on/off работает
  • Цвет соответствует severity (blocker красный, warning оранжевый, info синий)
  • Popup при клике показывает name + type_zone

Severity / Effort

🟡 P2 — визуальное улучшение, требование Макса. После #115 KILLER (точки подключения) — это второй визуальный слой.

Effort: 1-2 дня (backend +geom_geojson 1ч + frontend ZouitLayer + LayerControl + integration ~1д + tests)

  • #232 — wire cad_zouit в analyze (closed by #248)
  • #115 / #230 — pattern Leaflet layer toggle (ConnectionPointsLayer.tsx, CpLayerControlPanel.tsx)
  • #248 — текущий PR с fallback который наполняет nspd_zouit_overlaps

(Создано 2026-05-17 после QA на проде — user видит ЗОУИТ в text list но не на карте)

## Контекст / требование Макса Сейчас на /site-finder ЗОУИТ overlaps показаны **только в text list** под картой: ``` Зоны с особыми условиями использования (ЗОУИТ) [INFO] cad_zouit Охранная зона тепловой сети с кад. № 66:41:0204016:57 [INFO] cad_zouit Охранная зона тепловой сети ... [INFO] cad_zouit Публичный сервитут в целях размещения тепловой сети ... ``` Макс хочет **визуально на карте** — схематичные полигоны overlay'ом, чтобы видеть где именно находятся охранные зоны относительно участка. ## Что есть в БД `cad_zouit` table (3 483 строки): - `geom GEOGRAPHY(POLYGON, 4326)` — реальная геометрия охранных зон - `type_zone` — категория (охранная зона тепловой сети / СЗЗ / зона публичного сервитута / охранная зона трубопровода / электроэнергетики / газа / связи) - `category_name` — группа (ЗОУИТ general / энергетика-связь-транспорт / иные) - `name` — полное описание - GIST index `cad_zouit_geom_gist` API: после PR #248 `/analyze` возвращает `nspd_zouit_overlaps` со всеми пересечениями (radius 200m по умолчанию), но **без geometry** — только textual fields. ## Что нужно ### Backend (small extension) В `quarter_dump_lookup._get_cad_zouit_overlaps` добавить в return **geom_geojson** field: ```python SELECT type_zone, category_name, name, category_id, zouit_id, ST_AsGeoJSON(geom::geometry) AS geom_geojson FROM cad_zouit WHERE ST_Intersects(geom, :parcel_wkt) ``` Каждый overlap dict теперь содержит `geom_geojson` (string). ### Frontend 1. **TS type extension** — `NspdZouitOverlap` добавить `geom_geojson?: string` 2. **Component** `frontend/src/components/site-finder/ZouitLayer.tsx`: - Принимать `overlaps: NspdZouitOverlap[]` + `visibleCategories: Set<ZouitCategory>` - Для каждого overlap: `JSON.parse(geom_geojson)` → `<GeoJSON>` (react-leaflet) с стилизацией - Стиль per category: - 🟥 blocker (охранная зона трубопровода/электр/газа) — красная заливка, opacity 0.3 - 🟧 warning (СЗЗ, охранная зона тепла) — оранжевая заливка - 🟦 info (зона сервитута) — синяя заливка - Click на полигон → popup с name + type_zone + source 3. **Layer control panel** `ZouitLayerControlPanel.tsx` (аналог `CpLayerControlPanel`): - Checkbox per-категория (blocker/warning/info) с цветным dot + count - Collapsible 4. **Integrate в SiteMap.tsx** — рендерить `<ZouitLayer>` поверх остальных слоёв с toggle 5. **page.tsx** — после analyze response передавать `data.nspd_zouit_overlaps` в SiteMap ### Tests - Backend: pytest для `_get_cad_zouit_overlaps` — verify `geom_geojson` field присутствует - Frontend: tsc/lint clean, playwright smoke на /site-finder с cad имеющим ЗОУИТ overlaps → screenshot карты с полигонами ## Acceptance - На /site-finder для cad `66:41:0204016:10` ЗОУИТ полигоны видны на карте (минимум охранная зона тепловой сети) - Layer toggle on/off работает - Цвет соответствует severity (blocker красный, warning оранжевый, info синий) - Popup при клике показывает name + type_zone ## Severity / Effort 🟡 **P2** — визуальное улучшение, требование Макса. После #115 KILLER (точки подключения) — это второй визуальный слой. **Effort:** 1-2 дня (backend +geom_geojson 1ч + frontend ZouitLayer + LayerControl + integration ~1д + tests) ## Links - #232 — wire cad_zouit в analyze (closed by #248) - #115 / #230 — pattern Leaflet layer toggle (`ConnectionPointsLayer.tsx`, `CpLayerControlPanel.tsx`) - #248 — текущий PR с fallback который наполняет `nspd_zouit_overlaps` (Создано 2026-05-17 после QA на проде — user видит ЗОУИТ в text list но не на карте)
Sign in to join this conversation.
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#255
No description provided.