gendesign/data/sql/170_osm_utility_infrastructure_ekb.sql
Light1YT 8d1e483271
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Successful in 1m0s
CI / openapi-codegen-check (pull_request) Successful in 1m57s
CI / backend-tests (pull_request) Successful in 11m13s
chore: rename migration 100→170 (next free seq; 100-105 taken, max=169) (#1746)
2026-06-27 00:49:02 +05:00

53 lines
3.3 KiB
PL/PgSQL

-- 170_osm_utility_infrastructure_ekb.sql
-- Context: Таблица инженерных сетей («инженерные сети») Екатеринбурга из OSM (#1746).
-- No-B2B open-data путь: Overpass API. Хранит магистральные линии
-- (ЛЭП, трубопроводы — way → LineString) И точки/узлы (опоры ЛЭП,
-- подстанции, водозаборы, ЦТП, вышки связи — node → Point) для быстрых
-- ST_DWithin-запросов «инж.сети в радиусе участка».
-- Дополняет osm_noise_sources_ekb (там utility-срез завязан на noise-loader);
-- этот слой — самостоятельный, типизированный по infrastructure_kind.
-- Source: Overpass API (power/water/gas/heat/communication queries).
-- Geometry: mixed (LineString для way / Point для node) -> geometry(Geometry, 4326)
-- Dependencies: PostGIS (уже установлен в prod)
-- Deploy order: standalone, нет зависимостей от других таблиц
-- Idempotent: да (IF NOT EXISTS / IF NOT EXISTS на индексах)
BEGIN;
CREATE TABLE IF NOT EXISTS osm_utility_infrastructure_ekb (
id BIGSERIAL PRIMARY KEY,
osm_id BIGINT NOT NULL,
osm_type TEXT NOT NULL, -- 'node' | 'way' | 'relation'
-- Нормализованный вид инженерной сети:
-- 'power' | 'water' | 'gas' | 'heat' | 'communication' | 'sewage'
infrastructure_kind TEXT NOT NULL,
name TEXT,
geom GEOMETRY(Geometry, 4326) NOT NULL, -- линии И точки
source_tag TEXT, -- OSM key=value, по которому элемент пойман
tags JSONB DEFAULT '{}'::jsonb,
fetched_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (osm_type, osm_id)
);
-- GIST индекс для ST_DWithin / ST_Intersects запросов (инж.сети в радиусе участка)
CREATE INDEX IF NOT EXISTS osm_utility_infrastructure_ekb_geom_idx
ON osm_utility_infrastructure_ekb USING GIST (geom);
-- Индекс по виду сети для фильтрации (power/water/gas/...)
CREATE INDEX IF NOT EXISTS osm_utility_infrastructure_ekb_kind_idx
ON osm_utility_infrastructure_ekb (infrastructure_kind);
COMMENT ON TABLE osm_utility_infrastructure_ekb IS
'Инженерные сети Екатеринбурга из OSM (power/water/gas/heat/communication/sewage). '
'No-B2B open-data источник: Overpass API. Линии (ЛЭП/трубопроводы) и узлы '
'(подстанции/водозаборы/ЦТП/вышки связи) для site-finder utility-infrastructure. '
'Маппинг OSM-тегов -> infrastructure_kind: '
'backend/app/services/site_finder/utility_infrastructure_loader.py';
COMMENT ON COLUMN osm_utility_infrastructure_ekb.infrastructure_kind IS
'Нормализованный вид сети: power | water | gas | heat | communication | sewage.';
COMMENT ON COLUMN osm_utility_infrastructure_ekb.source_tag IS
'OSM key=value, по которому элемент пойман (например power=line, pipeline=gas).';
COMMIT;