78 lines
6.1 KiB
PL/PgSQL
78 lines
6.1 KiB
PL/PgSQL
-- 134_planning_projects.sql
|
||
-- #1085 (Site Finder v2 / future-supply «GG-форсайт») — store ППТ/ПМТ ЕКБ (геометрия + реквизиты).
|
||
--
|
||
-- Future-supply: что/где утверждено к застройке. Источник — ЕКБ-геопортал GeoServer WFS
|
||
-- (ekb_geoportal_client.py, #1083): слои portal_geo_dmd_prj_plan (ППТ — проекты планировки) и
|
||
-- portal_geo_dmd_prj_mej (ПМТ — проекты межевания). Каждая фича — утверждённый документ
|
||
-- планировки с геометрией охвата + doc_status/год (live-verified 2026-06-06, vault research/
|
||
-- EKB_Geoportal_WFS_Construction_Intel_Jun06).
|
||
--
|
||
-- ОТДЕЛЬНАЯ таблица (не ird_overlays м.132): ird_overlays — НСПД-ограничения участка (per-feature
|
||
-- ЗОУИТ/ПЗЗ/ОКН + reg_numb_border + category/subcategory), а тут документ-центричная модель
|
||
-- геопортала (doc_status / dmd_actual_year / project_name / full_name) из другого источника (WFS,
|
||
-- уже EPSG:4326). Смешивать схемы — натяжка; держим раздельно, analyze читает overlap отдельно.
|
||
--
|
||
-- Что отдаёт WFS-фича (DescribeFeatureType + live): key (стабильный id портала), full_name
|
||
-- (документ-описание), doc_full_name/doc_status/doc_status_name (статус утверждения),
|
||
-- dmd_actual_year (год актуальности), project_name, geoloc (геометрия 4326).
|
||
--
|
||
-- Зерно (grain): одна строка = одна WFS-фича (один документ планировки) в слое. Дедуп-ключ —
|
||
-- (project_type, source_key): source_key = портальный `key`; project_type 'ppt'|'pmt'.
|
||
-- re-harvest UPSERT-ит (latest wins): документы стабильны, обновление = свежий fetched_at.
|
||
--
|
||
-- ТЭП/очередность из PDF пояснительных записок (pdfplumber) — отдельный проход (#1085 follow-up);
|
||
-- колонки tep/staging добавятся ALTER-ом позже (тут только WFS-слой: геометрия + статус).
|
||
--
|
||
-- Deploy: auto-applied deploy.yml через _schema_migrations (ровно один раз по NN). Idempotent:
|
||
-- CREATE TABLE/INDEX IF NOT EXISTS + guarded DO для UNIQUE (прецедент м.125/132/133).
|
||
|
||
BEGIN;
|
||
|
||
-- ── 1. Таблица planning_projects ───────────────────────────────────────────────
|
||
CREATE TABLE IF NOT EXISTS planning_projects (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
project_type TEXT NOT NULL, -- 'ppt' (проект планировки) | 'pmt' (проект межевания)
|
||
source_key BIGINT NOT NULL, -- стабильный `key` фичи геопортала (дедуп внутри типа)
|
||
full_name TEXT, -- описание документа (ПАГЕ № / «Об утверждении ...»)
|
||
doc_full_name TEXT, -- doc_full_name WFS
|
||
doc_status TEXT, -- doc_status (код/строка статуса утверждения)
|
||
doc_status_name TEXT, -- читаемый статус ('действующий'/'утверждён'/...)
|
||
project_name TEXT, -- project_name WFS
|
||
dmd_actual_year INTEGER, -- год актуальности документа (dmd_actual_year)
|
||
geom geometry(Geometry, 4326) NOT NULL, -- охват документа (WFS geoloc, уже 4326)
|
||
raw_props JSONB, -- полный properties фичи (forward-compat / ТЭП-резолв)
|
||
fetched_at timestamptz NOT NULL DEFAULT now(), -- когда harvest снял (freshness)
|
||
CONSTRAINT planning_projects_type_chk CHECK (project_type IN ('ppt', 'pmt')),
|
||
CONSTRAINT planning_projects_source_key_chk CHECK (source_key > 0)
|
||
);
|
||
|
||
COMMENT ON TABLE planning_projects IS
|
||
'ППТ/ПМТ ЕКБ (#1085, future-supply GG-форсайт): утверждённые проекты планировки/межевания из '
|
||
'ЕКБ-геопортала WFS (portal_geo_dmd_prj_plan/_mej). 1 строка = 1 WFS-фича (документ). UPSERT '
|
||
'harvest-воркером по uq_planning_projects (project_type, source_key). analyze читает overlap '
|
||
'участка через ST_Intersects(geom). ТЭП/очередность из PDF — отдельный проход (follow-up).';
|
||
COMMENT ON COLUMN planning_projects.source_key IS 'Стабильный `key` фичи ЕКБ-геопортала — дедуп-ключ внутри project_type';
|
||
COMMENT ON COLUMN planning_projects.doc_status_name IS 'Читаемый статус утверждения документа планировки (действующий/утверждён/...)';
|
||
|
||
-- ── 2. Дедуп/UPSERT-ключ (project_type, source_key) ────────────────────────────
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM pg_constraint WHERE conname = 'uq_planning_projects'
|
||
) THEN
|
||
ALTER TABLE planning_projects
|
||
ADD CONSTRAINT uq_planning_projects
|
||
UNIQUE (project_type, source_key);
|
||
END IF;
|
||
END
|
||
$$;
|
||
|
||
-- ── 3. Индексы ─────────────────────────────────────────────────────────────────
|
||
-- Главный read-path: spatial overlap участка (analyze: ST_Intersects(parcel.geom, pp.geom)).
|
||
CREATE INDEX IF NOT EXISTS idx_planning_projects_geom
|
||
ON planning_projects USING GIST (geom);
|
||
-- Фильтр по типу проекта (выборка «все ППТ» / «все ПМТ»).
|
||
CREATE INDEX IF NOT EXISTS idx_planning_projects_type
|
||
ON planning_projects (project_type);
|
||
|
||
COMMIT;
|