gendesign/data/sql/141_okn_objects.sql
lekss361 50fcba1ca0
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy / build-backend (push) Successful in 1m23s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 2m21s
Deploy / deploy (push) Successful in 1m15s
feat(sf): ingest ОКН-объектов ЕКБ из АИС ЕГРКН (точки+категория) → okn_objects (#1141)
Co-authored-by: lekss361 <lekss361@gendsgn.local>
Co-committed-by: lekss361 <lekss361@gendsgn.local>
2026-06-07 12:51:18 +00:00

65 lines
3.7 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 141_okn_objects.sql
-- #1066 (Site Finder v2 / GG-форсайт) — объекты культурного наследия (ОКН/памятники)
-- ЕКБ и Свердловской обл. из АИС ЕГРКН Минкультуры.
--
-- Источник: https://okn-mk.mkrf.ru/Maps/searchMap (POST, application/x-www-form-urlencoded)
-- Формат ответа: GeoJSON FeatureCollection с полями id + coordinates[lat, lon] (Яндекс-порядок).
--
-- Обновляется еженедельно воркером okn_objects_sync (tasks/okn_objects_sync.py).
-- Ключ дедупликации: source_id (id фичи карты ЕГРКН).
-- Категория берётся из прохода по cob_category_type=1/2/4 (federal/regional/local).
--
-- Deploy: auto-applied deploy.yml через _schema_migrations (ровно один раз по NN).
-- Idempotent (CREATE TABLE/INDEX IF NOT EXISTS + guarded DO-блоки по pg_constraint).
-- Без INSERT — данные приходят из Celery-воркера.
BEGIN;
-- ── 1. Таблица okn_objects ────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS okn_objects (
id BIGSERIAL PRIMARY KEY,
source_id TEXT NOT NULL, -- id фичи из ЕГРКН карты (дедуп)
category TEXT, -- 'federal' | 'regional' | 'local'
geom geometry(Point, 4326) NOT NULL, -- WGS84 точка (lon, lat)
raw_props JSONB, -- сырые props GeoJSON-фичи
fetched_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
COMMENT ON TABLE okn_objects IS
'Объекты культурного наследия (ОКН/памятники) ЕКБ и Свердловской обл. (#1066). '
'Источник: АИС ЕГРКН Минкультуры (okn-mk.mkrf.ru/Maps/searchMap). '
'Обновляется еженедельно воркером okn_objects_sync.';
COMMENT ON COLUMN okn_objects.source_id IS
'id фичи из GeoJSON ответа карты ЕГРКН. Используется как ключ дедупликации.';
COMMENT ON COLUMN okn_objects.category IS
'Категория ОКН: federal (cob_category_type=1), regional (=2), local (=4).';
COMMENT ON COLUMN okn_objects.geom IS
'Точка в WGS84 (EPSG:4326). Координаты из ЕГРКН [lat, lon] перевёрнуты: '
'ST_MakePoint(coordinates[1], coordinates[0]).';
-- ── 2. UNIQUE по source_id — ключ дедупликации для UPSERT ────────────────────
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'uq_okn_objects_source_id'
) THEN
ALTER TABLE okn_objects
ADD CONSTRAINT uq_okn_objects_source_id UNIQUE (source_id);
END IF;
END
$$;
-- ── 3. GIST-индекс по геометрии (ST_DWithin / пространственный lookup) ────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_geom
ON okn_objects USING GIST (geom);
-- ── 4. Индекс по категории (фильтрация по federal/regional/local) ─────────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_category
ON okn_objects (category);
-- ── 5. Индекс по свежести данных ─────────────────────────────────────────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_fetched_at
ON okn_objects (fetched_at DESC);
COMMIT;