- 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 ЖК района — все реалистичные.
21 lines
1,012 B
SQL
21 lines
1,012 B
SQL
-- Привязка ЖК к району Екатеринбурга через PostGIS spatial-join.
|
||
-- Источник полигонов: ekb_districts_geom (см. 56_*).
|
||
-- Idempotent.
|
||
|
||
ALTER TABLE domrf_kn_objects
|
||
ADD COLUMN IF NOT EXISTS district_name TEXT;
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_kn_objects_district
|
||
ON domrf_kn_objects (district_name)
|
||
WHERE district_name IS NOT NULL;
|
||
|
||
-- Backfill: для всех ЖК Свердл (region_cd=66) с координатами — найти район.
|
||
-- ST_Contains даёт точное «точка внутри полигона». ЖК вне всех 8 районов
|
||
-- (Первоуральск, Н.Тагил и т.п.) останутся с district_name=NULL.
|
||
UPDATE domrf_kn_objects o
|
||
SET district_name = d.district_name
|
||
FROM ekb_districts_geom d
|
||
WHERE o.latitude IS NOT NULL AND o.longitude IS NOT NULL
|
||
AND o.region_cd = 66
|
||
AND ST_Contains(d.geom,
|
||
ST_SetSRID(ST_MakePoint(o.longitude, o.latitude), 4326));
|