-- 82_osm_poi_ekb.sql -- Context: Site Finder feature — анализ участка по близости к социальной -- инфраструктуре. Хранение OSM POI для быстрых ST_DWithin запросов -- в радиусе 1-3 км от анализируемого участка. -- Dependencies: PostGIS extension (уже включён в prod) -- Deploy order: standalone — нет зависимостей от других таблиц -- Idempotent: да (IF NOT EXISTS / CREATE INDEX IF NOT EXISTS) BEGIN; CREATE TABLE IF NOT EXISTS osm_poi_ekb ( poi_id BIGSERIAL PRIMARY KEY, osm_id BIGINT NOT NULL, osm_type TEXT NOT NULL, -- 'school' | 'kindergarten' | 'pharmacy' | 'hospital' | 'shop_mall' | -- 'shop_supermarket' | 'shop_small' | 'park' | 'tram_stop' | -- 'bus_stop' | 'metro_stop' category TEXT NOT NULL, name TEXT, lat NUMERIC(10, 7) NOT NULL, lon NUMERIC(10, 7) NOT NULL, geom GEOMETRY(Point, 4326) NOT NULL, -- Дата последнего редактирования POI в OSM. -- Для фильтра "данные не старше 2 лет" (требование Максима). last_osm_edit_date DATE, -- Остальные OSM теги для drill-down tags JSONB NOT NULL DEFAULT '{}'::jsonb, fetched_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE (osm_type, osm_id, category) ); -- GIST индекс для ST_DWithin / ST_Intersects запросов CREATE INDEX IF NOT EXISTS osm_poi_ekb_geom_gist ON osm_poi_ekb USING GIST (geom); -- Индекс по категории для фильтрации по типу инфраструктуры CREATE INDEX IF NOT EXISTS osm_poi_ekb_category_idx ON osm_poi_ekb (category); -- Индекс по дате редактирования для фильтра свежести данных CREATE INDEX IF NOT EXISTS osm_poi_ekb_last_edit_idx ON osm_poi_ekb (last_osm_edit_date); COMMENT ON TABLE osm_poi_ekb IS 'Социальная инфраструктура Екатеринбурга из OSM. Источник: Overpass API. ' 'Используется для site-finder scoring (близость школ, садов, магазинов, ст. транспорта).'; COMMENT ON COLUMN osm_poi_ekb.category IS 'Нормализованная категория. Маппинг OSM-тегов → category: ' 'см. backend/app/services/site_finder/poi_loader.py'; COMMENT ON COLUMN osm_poi_ekb.last_osm_edit_date IS 'Дата последнего редактирования POI в OSM. ' 'Для фильтра "данные не старше 2 лет" (требование Максима).'; COMMIT;