gendesign/data/sql/56_schema_ekb_districts_geom.sql
lekss361 17ad0e18f5 feat(geo): ЖК → district mapping через PostGIS-полигоны OSM (Limit_District_Geometry closed)
- 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 ЖК района — все реалистичные.
2026-04-29 08:03:38 +03:00

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);