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