-- 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;