Co-authored-by: bot-backend <bot-backend@gendsgn.local> Co-committed-by: bot-backend <bot-backend@gendsgn.local>
60 lines
3.5 KiB
PL/PgSQL
60 lines
3.5 KiB
PL/PgSQL
-- 142_pat_subzones.sql
|
||
-- #1065 / #1067 (Site Finder v2 / GG-форсайт) — подзоны приаэродромных территорий (ПАТ).
|
||
-- Первый аэродром: Кольцово (Приказ Росавиации № 367-П от 02.06.2023, ред. 804-П от 27.10.2025).
|
||
--
|
||
-- Геометрия строится Celery-воркером pat_subzones_load из извлечённых координат МСК-66
|
||
-- (файл data/pat/koltsovo_367p_subzones.json) с репроекцией → WGS84 (EPSG:4326).
|
||
--
|
||
-- Поддерживает несколько аэродромов (поле aerodrome), subzone_no=0 — общий контур.
|
||
--
|
||
-- Deploy: auto-applied deploy.yml через _schema_migrations (ровно один раз по NN=142).
|
||
-- Idempotent (CREATE TABLE/INDEX IF NOT EXISTS + guarded DO-блоки).
|
||
-- Данные загружаются отдельно Celery-воркером (tasks.pat_subzones_load.load_koltsovo_pat).
|
||
|
||
BEGIN;
|
||
|
||
-- ── 1. Таблица pat_subzones ───────────────────────────────────────────────────
|
||
CREATE TABLE IF NOT EXISTS pat_subzones (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
aerodrome TEXT NOT NULL, -- 'Екатеринбург (Кольцово)' и т.д.
|
||
subzone_no INTEGER NOT NULL, -- 1..6; 0 = aggregate_outline
|
||
name TEXT, -- 'Первая подзона' и т.д.
|
||
restriction TEXT, -- текст ограничения из приказа
|
||
geom geometry(MultiPolygon, 4326) NOT NULL,
|
||
source TEXT, -- URL/реквизит НПА
|
||
fetched_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
COMMENT ON TABLE pat_subzones IS
|
||
'Подзоны приаэродромных территорий (ПАТ), EPSG:4326 (#1065/#1067). '
|
||
'Источник: Приказы Росавиации. Первый аэродром: Кольцово (367-П/804-П). '
|
||
'Геометрия загружается воркером tasks.pat_subzones_load.load_koltsovo_pat.';
|
||
|
||
COMMENT ON COLUMN pat_subzones.aerodrome IS
|
||
'Наименование аэродрома из НПА, напр. «Екатеринбург (Кольцово)».';
|
||
COMMENT ON COLUMN pat_subzones.subzone_no IS
|
||
'Номер подзоны 1..6 по НБНРД. 0 — aggregate_outline (общий контур ПАТ).';
|
||
COMMENT ON COLUMN pat_subzones.geom IS
|
||
'MultiPolygon WGS84. Внутренние границы секторов стали дырками Polygon.';
|
||
|
||
-- ── 2. UNIQUE (aerodrome, subzone_no) — ключ для UPSERT ──────────────────────
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM pg_constraint WHERE conname = 'uq_pat_subzones_aerodrome_no'
|
||
) THEN
|
||
ALTER TABLE pat_subzones
|
||
ADD CONSTRAINT uq_pat_subzones_aerodrome_no UNIQUE (aerodrome, subzone_no);
|
||
END IF;
|
||
END
|
||
$$;
|
||
|
||
-- ── 3. GIST-индекс по геометрии (ST_Intersects / parcel-lookup) ──────────────
|
||
CREATE INDEX IF NOT EXISTS idx_pat_subzones_geom
|
||
ON pat_subzones USING GIST (geom);
|
||
|
||
-- ── 4. Индекс по аэродрому (фильтрация per-aerodrome) ────────────────────────
|
||
CREATE INDEX IF NOT EXISTS idx_pat_subzones_aerodrome
|
||
ON pat_subzones (aerodrome);
|
||
|
||
COMMIT;
|