All checks were successful
CI / changes (push) Successful in 6s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m21s
CI / backend-tests (pull_request) Successful in 6m16s
65 lines
3.7 KiB
PL/PgSQL
65 lines
3.7 KiB
PL/PgSQL
-- 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;
|