- 56_fetch_ekb_districts.py: Overpass query (admin_level=9 в bbox ЕКБ), shapely-ассемблинг рваных OSM-веев в MultiPolygon, кэш в data/raw/. - 56_schema_ekb_districts_geom.sql: CREATE TABLE с GIST. - 57_kn_objects_district.sql: ALTER + backfill UPDATE через ST_Contains. 3032 ЖК Свердл проставили district_name (208 в Академическом, 158 в Чкаловском, и т.д.), 454 за bbox ЕКБ остались NULL. - domrf_kn.py: _backfill_district_names() после Phase A — каждый sweep автоматически проставляет district_name свежезаписанным ЖК. - analytics_queries.py: 4 места addr ILIKE → district_name = :dn (_velocity_baseline, _elasticity_coef, _active_competitors_count, comparable). - analytics_queries.py: graceful obj_class-degrade — если в районе все obj_class=NULL (kn-API quirk), фильтр по target_class опускается на уровне geo-запросов с warning. class_multiplier на ценах продолжает работать. Smoke (Академический, Comfort, 50K м²): velocity_source=sale_graph (104 ЖК / 1872 точек), competitors=208 в районе, headline «3400 млн ₽ · 112 мес · ликвидность 21/100», 5 comparable ЖК района — все реалистичные.
18 lines
776 B
SQL
18 lines
776 B
SQL
-- ekb_districts_geom — PostGIS-полигоны 8 районов Екатеринбурга из OSM.
|
|
-- Загрузка через scripts/56_fetch_ekb_districts.py.
|
|
-- Используется для spatial-join (lat,lon) → district в:
|
|
-- 1. backfill domrf_kn_objects.district_name
|
|
-- 2. recommend_mix (_velocity_baseline / _elasticity_coef / comparable / competitors)
|
|
-- Idempotent.
|
|
|
|
CREATE EXTENSION IF NOT EXISTS postgis;
|
|
|
|
CREATE TABLE IF NOT EXISTS ekb_districts_geom (
|
|
district_name TEXT PRIMARY KEY REFERENCES ekb_districts(district_name),
|
|
geom geometry(MultiPolygon, 4326) NOT NULL,
|
|
osm_id BIGINT,
|
|
fetched_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_ekb_districts_geom_geom
|
|
ON ekb_districts_geom USING GIST (geom);
|