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