Gate G1: Импорт ПЗЗ ЕКБ shape → pzz_zones_ekb #28

Closed
opened 2026-05-11 20:13:26 +00:00 by lekss361 · 3 comments
lekss361 commented 2026-05-11 20:13:26 +00:00 (Migrated from github.com)

Эшелон: 🔴 Gate — «Можно ли тут строить МКД»

Контекст / проблема

Таблица pzz_zones_ekb создана пустой (0 строк), schema есть: id, rosreestr_id, zone_code, zone_name, description, raw_props jsonb, geom, fetched_at. В /parcels/{cad}/analyze участок не сверяется с ПЗЗ — скоринг даёт высокий POI score даже там, где запрещён МКД (например ОД-1, П-1, Р-2). Это убивает доверие к продукту.

Что сделать

  1. Найти shape ПЗЗ Екатеринбурга — data.midural.ru / геопортал ЕКБ / public WMS export. Источники предпочтения:
    • data.midural.ru (Открытые данные Свердл) — .shp exported
    • геопортал-екатеринбург.рф WMS → GetCapabilities → tile-by-tile shape rip
    • Ручной запрос в Минстрой Свердл (последняя миля)
  2. Импорт через shp2pgsql -s SOURCE_SRID:4326 zones.shp pzz_zones_ekb_staging | psql → нормализация → pzz_zones_ekb
  3. Распарсить параметры из raw_props JSON: max_floors, max_far (коэф использования терр), min_parking_per_flat — отдельные колонки (см. G4 для extract логики)
  4. GIST индекс на geom
  5. Endpoint extension в analyze: gate.pzz_zones — список intersected zones + can_build_mkd: bool

Acceptance

  • SELECT COUNT(*) FROM pzz_zones_ekb > 200 (ожидаемо ~300-500 зон в ЕКБ)
  • ST_IsValid(geom) = true для всех строк
  • Тест на 5 известных участках (Академический, Центр, Юго-Западный): возвращается ожидаемый zone_code
  • /parcels/66:41:0204016:10/analyze возвращает в gate.pzz_zones непустой список

Owner

database-expert (shape import + schema) → backend-engineer (analyze integration)

Effort

1–1.5 дня

Risks / open

  • Shape с data.midural.ru может потребовать ручного запроса (нет публичной ссылки)
  • CRS heterogeneity: проверить srid перед import (МСК-66? Pulkovo?)
  • Закладываем extensibility для других городов — schema нейтральная к региону, не префиксить _ekb в новые колонки

Dependencies

— (foundation для G4, G5)

**Эшелон:** 🔴 Gate — «Можно ли тут строить МКД» ## Контекст / проблема Таблица `pzz_zones_ekb` создана пустой (**0 строк**), schema есть: `id, rosreestr_id, zone_code, zone_name, description, raw_props jsonb, geom, fetched_at`. В `/parcels/{cad}/analyze` участок не сверяется с ПЗЗ — скоринг даёт высокий POI score даже там, где **запрещён МКД** (например ОД-1, П-1, Р-2). Это убивает доверие к продукту. ## Что сделать 1. Найти shape ПЗЗ Екатеринбурга — data.midural.ru / геопортал ЕКБ / public WMS export. Источники предпочтения: - data.midural.ru (Открытые данные Свердл) — `.shp` exported - геопортал-екатеринбург.рф WMS → GetCapabilities → tile-by-tile shape rip - Ручной запрос в Минстрой Свердл (последняя миля) 2. Импорт через `shp2pgsql -s SOURCE_SRID:4326 zones.shp pzz_zones_ekb_staging | psql` → нормализация → `pzz_zones_ekb` 3. Распарсить параметры из `raw_props` JSON: max_floors, max_far (коэф использования терр), min_parking_per_flat — отдельные колонки (см. G4 для extract логики) 4. GIST индекс на `geom` 5. Endpoint extension в `analyze`: `gate.pzz_zones` — список intersected zones + `can_build_mkd: bool` ## Acceptance - [ ] `SELECT COUNT(*) FROM pzz_zones_ekb` > 200 (ожидаемо ~300-500 зон в ЕКБ) - [ ] `ST_IsValid(geom)` = true для всех строк - [ ] Тест на 5 известных участках (Академический, Центр, Юго-Западный): возвращается ожидаемый zone_code - [ ] `/parcels/66:41:0204016:10/analyze` возвращает в `gate.pzz_zones` непустой список ## Owner `database-expert` (shape import + schema) → `backend-engineer` (analyze integration) ## Effort 1–1.5 дня ## Risks / open - Shape с data.midural.ru может потребовать ручного запроса (нет публичной ссылки) - CRS heterogeneity: проверить srid перед import (МСК-66? Pulkovo?) - Закладываем **extensibility для других городов** — schema нейтральная к региону, не префиксить `_ekb` в новые колонки ## Dependencies — (foundation для G4, G5) ## Links - Текущая реализация: [SiteFinder_v3_May11](https://obsidian.gendsgn.ru/) v3.x - Related: #27 (мета v4 — будет закрыт после Gate-stage), [Limit_District_Geometry](https://obsidian.gendsgn.ru/)
lekss361 commented 2026-05-12 05:46:01 +00:00 (Migrated from github.com)

Обновлённый подход (после reverse-engineering НСПД API через #94):

Вместо ручного импорта ПЗЗ shape с data.midural.ru — использовать слой 875838 'Территориальные зоны' через НСПД WMS API:

  • Legend категорий: Жилая зона / Производственная / Общественно-деловая / Сельхоз / Рекреационная / ООТ / Военные / Спец.назначения / Иная
  • Bulk fetch через bbox tiling (workaround на отсутствие WFS)
  • Полное покрытие РФ из коробки — multi-region scaling готов

Зависимость: #94 (NSPD client foundation). После реализации #94 — этот issue становится простой Celery task sync_territorial_zones_bbox. Effort с ~1.5 дня снижается до ~0.5 дня.

**Обновлённый подход** (после reverse-engineering НСПД API через #94): Вместо ручного импорта ПЗЗ shape с data.midural.ru — использовать **слой 875838 'Территориальные зоны'** через НСПД WMS API: - Legend категорий: Жилая зона / Производственная / Общественно-деловая / Сельхоз / Рекреационная / ООТ / Военные / Спец.назначения / Иная - Bulk fetch через bbox tiling (workaround на отсутствие WFS) - Полное покрытие РФ из коробки — multi-region scaling готов **Зависимость:** #94 (NSPD client foundation). После реализации #94 — этот issue становится простой Celery task `sync_territorial_zones_bbox`. Effort с ~1.5 дня снижается до ~0.5 дня.
lekss361 commented 2026-05-12 11:54:20 +00:00 (Migrated from github.com)

Update 2026-05-12 — План без изменений, но контекст обновлён

После breakthrough в #94 (REST search-by-quarter = primary) — тер.зоны 875838 НЕ возвращаются в search-by-quarter, остаются только bbox-based.

Что подтверждено

В test квартале 66:41:0303161 search вернул 117 features (ЗУ + Здания + Помещения + Машино-места + Сооружения + ЗОУИТ + Кварталы + ЕНК), но тер.зоны (875838) и красные линии (879243) отсутствуют.

Причина: эти слои НЕ привязаны к cad_quarter, они привязаны к административному bbox (Свердл / МО / нас.пункт).

Сохраняющийся план

  • Через WMS GetFeatureInfo (или GetMap render для visual overlay) по bbox tiling
  • Альтернатива через shape import с data.midural.ru (если данные есть — нужно ручное обращение)
  • Альтернатива через ФГИС ТП XSD parser (Приказ Минэк №89 от 13.02.2025) — но эффорт 5-7 дней

Рекомендованная стратегия

Phase A (быстро, ~1 день):

  • WMS GetMap render слоя 875838 для bbox Свердл — получаем visual tiles
  • Кэшируем на нашем CDN
  • Без атрибуции (только цвета) — но для UI overlay достаточно

Phase B (~2-3 дня):

  • WMS GetFeatureInfo по bbox 1×1 км для каждой точки Свердл
  • Получаем features с атрибуцией (zone_code, zone_name, description)
  • Загрузка в pzz_zones_ekb (или нейтрально pzz_zones без city prefix per CLAUDE.md)
  • ~3000 запросов для full coverage ЕКБ (1 req/s = 50 мин)
  • Параллельно может быть и shape import (если получим)

Schema (без изменений vs план)

CREATE TABLE pzz_zones (
  id BIGSERIAL PRIMARY KEY,
  region_code VARCHAR(2),               -- '66' для Свердл
  zone_code TEXT,                       -- "Ж-2", "ОД-1", "П-1"
  zone_name TEXT,
  description TEXT,
  raw_props JSONB,
  geom GEOMETRY(POLYGON, 4326),
  geom_msk66 GEOMETRY(POLYGON, 100000) GENERATED ALWAYS AS (ST_Transform(geom, 100000)) STORED,
  fetched_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX gist_pzz_zones_geom ON pzz_zones USING GIST(geom);
CREATE INDEX gist_pzz_zones_geom_msk66 ON pzz_zones USING GIST(geom_msk66);

Effort без изменений: 1-1.5 дня

(но теперь не блокирует G4/G5 — те получают тер.зоны из same WMS bbox tiling)

См. NSPD_API_Map_May12 Update part 6 + Sprint4_SiteFinder_v4 Update part 4.

## Update 2026-05-12 — План без изменений, но контекст обновлён После breakthrough в #94 (REST search-by-quarter = primary) — **тер.зоны 875838 НЕ возвращаются** в search-by-quarter, остаются **только bbox-based**. ### Что подтверждено В test квартале 66:41:0303161 search вернул 117 features (ЗУ + Здания + Помещения + Машино-места + Сооружения + ЗОУИТ + Кварталы + ЕНК), **но тер.зоны (875838) и красные линии (879243) отсутствуют**. Причина: эти слои НЕ привязаны к cad_quarter, они привязаны к административному bbox (Свердл / МО / нас.пункт). ### Сохраняющийся план - Через WMS GetFeatureInfo (или GetMap render для visual overlay) по bbox tiling - Альтернатива через shape import с data.midural.ru (если данные есть — нужно ручное обращение) - Альтернатива через ФГИС ТП XSD parser (Приказ Минэк №89 от 13.02.2025) — но эффорт 5-7 дней ### Рекомендованная стратегия **Phase A (быстро, ~1 день):** - WMS GetMap render слоя 875838 для bbox Свердл — получаем visual tiles - Кэшируем на нашем CDN - ❌ Без атрибуции (только цвета) — но для UI overlay достаточно **Phase B (~2-3 дня):** - WMS GetFeatureInfo по bbox 1×1 км для каждой точки Свердл - Получаем features с атрибуцией (`zone_code`, `zone_name`, `description`) - Загрузка в `pzz_zones_ekb` (или нейтрально `pzz_zones` без city prefix per CLAUDE.md) - ~3000 запросов для full coverage ЕКБ (1 req/s = 50 мин) - Параллельно может быть и shape import (если получим) ### Schema (без изменений vs план) ```sql CREATE TABLE pzz_zones ( id BIGSERIAL PRIMARY KEY, region_code VARCHAR(2), -- '66' для Свердл zone_code TEXT, -- "Ж-2", "ОД-1", "П-1" zone_name TEXT, description TEXT, raw_props JSONB, geom GEOMETRY(POLYGON, 4326), geom_msk66 GEOMETRY(POLYGON, 100000) GENERATED ALWAYS AS (ST_Transform(geom, 100000)) STORED, fetched_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX gist_pzz_zones_geom ON pzz_zones USING GIST(geom); CREATE INDEX gist_pzz_zones_geom_msk66 ON pzz_zones USING GIST(geom_msk66); ``` ### Effort без изменений: 1-1.5 дня (но теперь не блокирует G4/G5 — те получают тер.зоны из same WMS bbox tiling) См. [[NSPD_API_Map_May12]] Update part 6 + [[Sprint4_SiteFinder_v4]] Update part 4.
Collaborator

Superseded (ground-truth 2026-06-13). ПЗЗ-shape import в pzz_zones_ekb не выполнен (нет публичной ссылки на shape data.midural.ru, risk подтверждён), таблица=0. НО цель «ПЗЗ-зональность для gate» достигнута ИНЫМ путём: nspd_quarter_dumps.territorial_zones (875838, 205/264 кв) + cad_zouit + zone_regulation_cache (max_far/max_floors из EKB-geoportal urbanCard). gate_verdict.is_residential_zone работает. Acceptance (pzz_zones_ekb>200) невыполним без shape, но функция закрыта альтернативой. Закрываю superseded.

**Superseded (ground-truth 2026-06-13).** ПЗЗ-shape import в `pzz_zones_ekb` не выполнен (нет публичной ссылки на shape data.midural.ru, risk подтверждён), таблица=0. НО цель «ПЗЗ-зональность для gate» достигнута ИНЫМ путём: `nspd_quarter_dumps.territorial_zones` (875838, 205/264 кв) + `cad_zouit` + `zone_regulation_cache` (max_far/max_floors из EKB-geoportal urbanCard). `gate_verdict.is_residential_zone` работает. Acceptance (pzz_zones_ekb>200) невыполним без shape, но функция закрыта альтернативой. Закрываю superseded.
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#28
No description provided.