gendesign/data/sql/170_osm_utility_infrastructure_ekb.sql
bot-backend 3753079dee
All checks were successful
Deploy / changes (push) Successful in 7s
Deploy / build-backend (push) Successful in 1m53s
Deploy / build-worker (push) Successful in 3m6s
Deploy / build-frontend (push) Successful in 3m19s
Deploy / deploy (push) Successful in 1m26s
feat(site-finder): OSM engineering-networks loader + endpoint (#1746) (#1930)
2026-06-26 20:01:00 +00: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;