Demand: Помещения ЕГРН (38489) + Машино-места (38490) — per-flat cross-check + parking ratio #96

Closed
opened 2026-05-12 05:57:06 +00:00 by lekss361 · 2 comments
lekss361 commented 2026-05-12 05:57:06 +00:00 (Migrated from github.com)

Эшелон: Demand / Data Layer Extension

Контекст / открытие

При полном аудите НСПД (через debug browser, см. NSPD_API_Map_May12 / #94) найдено новое публичное API namespace /api/data-fund/v1/* (Фонд данных ГКО). В нём 2 критичных слоя, которых НЕТ в теме PKK:

  • 38489 «Помещения ЕГРН» — каждая квартира / комната / помещение с cad_num + площадь + кадастровая стоимость
  • 38490 «Машино-места» — паркинг с cad_num + площадь + стоимость

Доступ через стандартный WMS endpoint /api/aeggis/v4/{layerId}/wms?... или GetFeatureInfo на bbox.

Зачем для МКД-скоринга

Помещения 38489 — per-flat cross-check

Сейчас цена м² усредняется на уровне cad_quarter (через rosreestr_deals → D1 #33). Из НСПД слоя 38489 можно получить per-flat кадастровую стоимость для каждой квартиры в каждом конкурирующем ЖК → cross-check с реальной маркетинговой ценой и ДДУ.

Use case:

  • Anomaly detection: если кадастр стоит 90К ₽/м², а ДДУ показывает 200К ₽/м² → premium ЖК → boost для recommend
  • Price ceiling: кадастр стоит 120К, market 180К → потолок rynka
  • Cross-validation D6 (obj_class) — premium ЖК имеют кадастр >150К м²

Машино-места 38490 — parking ratio

Знание паркинга per ЖК открывает новый сигнал для recommend_mix:

  • Бизнес-класс обычно имеет 1.2+ маш/м² → norm parking
  • Эконом часто <0.5 → дефицит → boost для участков с возможным surface parking
  • Сравнение с конкурентами в радиусе 3км (D4 #36) — оцениваем дефицит/избыток паркинга в районе

Что сделать

1. Расширить NSPD client (#94)

class NSPDClient:
    async def get_premises_in_building(self, building_cad: str) -> list[PremiseFeature]:
        """Получить помещения в здании через WMS GetFeatureInfo bbox=building_geom."""
        # Layer 38489

    async def get_parking_in_complex(self, complex_geom_bbox: tuple) -> list[ParkingFeature]:
        """Получить машино-места в bbox комплекса."""
        # Layer 38490

2. Schema additions

  • cad_premises (cad_num, building_cad_num, area_sqm, cost_value, room_count?, floor?, fetched_at, geom, raw_props jsonb)
  • cad_parking (cad_num, complex_geom_ref, area_sqm, cost_value, fetched_at, geom, raw_props jsonb)

Both UNIQUE on cad_num + GIST индекс на geom.

3. Celery sync tasks

  • tasks.nspd_sync.sync_premises_for_building(building_cad) — on-demand при analyze
  • tasks.nspd_sync.bulk_parking_for_district(district_geom) — quarterly batch

4. Application в Site Finder

  • analyze_parcel extension: demand.cadastre_cross_check:
    • cad_median_price_per_m2 (из помещений в радиусе 1км)
    • market_premium_pct (market vs cadastre)
    • parking_ratio_neighbors (avg паркингов на квартиру в 3км)
  • UI карточка «Кадастр vs Рынок» в ScoreCard

5. Application в recommend_mix

  • Дополнительный сигнал для unit-mix: «в районе средний паркинг 0.8 → можно агрессивнее эконом» / «1.5 → premium-фокус»

Acceptance

  • get_premises_in_building возвращает помещения для test building cad
  • get_parking_in_complex возвращает паркинги для test bbox
  • cad_premises >100 записей после test run на 5 известных ЖК
  • analyze возвращает demand.cadastre_cross_check
  • Migration applied на prod

Owner

backend-engineer (NSPD client extension + tasks) + database-expert (schema)

Effort

~2 дня после #94

Dependencies

  • #94 (NSPD client foundation)

Risks / open

  • 38489/38490 могут иметь огромный объём данных (millions помещений в РФ). Bbox tiling должен быть аккуратным.
  • WMS GetFeatureInfo на большом bbox → timeout. Адаптивный chunk size.
**Эшелон:** Demand / Data Layer Extension ## Контекст / открытие При полном аудите НСПД (через debug browser, см. [[NSPD_API_Map_May12]] / #94) найдено **новое публичное API namespace `/api/data-fund/v1/*`** (Фонд данных ГКО). В нём 2 критичных слоя, которых **НЕТ в теме PKK**: - **38489 «Помещения ЕГРН»** — каждая квартира / комната / помещение с cad_num + площадь + кадастровая стоимость - **38490 «Машино-места»** — паркинг с cad_num + площадь + стоимость Доступ через стандартный WMS endpoint `/api/aeggis/v4/{layerId}/wms?...` или GetFeatureInfo на bbox. ## Зачем для МКД-скоринга ### Помещения 38489 — per-flat cross-check Сейчас цена м² усредняется на уровне cad_quarter (через rosreestr_deals → D1 #33). Из НСПД слоя **38489** можно получить **per-flat кадастровую стоимость** для каждой квартиры в каждом конкурирующем ЖК → cross-check с реальной маркетинговой ценой и ДДУ. **Use case:** - Anomaly detection: если кадастр стоит 90К ₽/м², а ДДУ показывает 200К ₽/м² → premium ЖК → boost для recommend - Price ceiling: кадастр стоит 120К, market 180К → потолок rynka - Cross-validation D6 (obj_class) — premium ЖК имеют кадастр >150К м² ### Машино-места 38490 — parking ratio Знание паркинга per ЖК открывает **новый сигнал для recommend_mix**: - Бизнес-класс обычно имеет 1.2+ маш/м² → norm parking - Эконом часто <0.5 → дефицит → boost для участков с возможным surface parking - Сравнение с конкурентами в радиусе 3км (D4 #36) — оцениваем дефицит/избыток паркинга в районе ## Что сделать ### 1. Расширить NSPD client (#94) ```python class NSPDClient: async def get_premises_in_building(self, building_cad: str) -> list[PremiseFeature]: """Получить помещения в здании через WMS GetFeatureInfo bbox=building_geom.""" # Layer 38489 async def get_parking_in_complex(self, complex_geom_bbox: tuple) -> list[ParkingFeature]: """Получить машино-места в bbox комплекса.""" # Layer 38490 ``` ### 2. Schema additions - `cad_premises` (cad_num, building_cad_num, area_sqm, cost_value, room_count?, floor?, fetched_at, geom, raw_props jsonb) - `cad_parking` (cad_num, complex_geom_ref, area_sqm, cost_value, fetched_at, geom, raw_props jsonb) Both UNIQUE on cad_num + GIST индекс на geom. ### 3. Celery sync tasks - `tasks.nspd_sync.sync_premises_for_building(building_cad)` — on-demand при analyze - `tasks.nspd_sync.bulk_parking_for_district(district_geom)` — quarterly batch ### 4. Application в Site Finder - `analyze_parcel` extension: `demand.cadastre_cross_check`: - `cad_median_price_per_m2` (из помещений в радиусе 1км) - `market_premium_pct` (market vs cadastre) - `parking_ratio_neighbors` (avg паркингов на квартиру в 3км) - UI карточка «Кадастр vs Рынок» в ScoreCard ### 5. Application в recommend_mix - Дополнительный сигнал для unit-mix: «в районе средний паркинг 0.8 → можно агрессивнее эконом» / «1.5 → premium-фокус» ## Acceptance - [ ] `get_premises_in_building` возвращает помещения для test building cad - [ ] `get_parking_in_complex` возвращает паркинги для test bbox - [ ] `cad_premises` >100 записей после test run на 5 известных ЖК - [ ] analyze возвращает `demand.cadastre_cross_check` - [ ] Migration applied на prod ## Owner `backend-engineer` (NSPD client extension + tasks) + `database-expert` (schema) ## Effort ~2 дня после #94 ## Dependencies - **#94** (NSPD client foundation) ## Risks / open - 38489/38490 могут иметь огромный объём данных (millions помещений в РФ). Bbox tiling должен быть аккуратным. - WMS GetFeatureInfo на большом bbox → timeout. Адаптивный chunk size. ## Links - Research: [[NSPD_API_Map_May12]] (раздел Update 2026-05-12 — data-fund API) - Foundation: #94 - Cross-ref: #33 D1, #36 D4, #38 D6
Owner

Status update — НЕ реализовано. cad_premises / cad_parking таблиц нет. NSPDClient.get_premises_in_building / get_parking_in_complex методы не добавлены.

Зависит от #94 NSPD client foundation. Sprint 1.1 done (TIER 3 risk + TIER 4 opportunity), но per-flat / parking layers (38489/38490) пока не входили в PR1-4 scope.

Issue остаётся в backlog priority/high — открывает D6 obj_class cross-check + recommend_mix parking signal.

Status update — НЕ реализовано. `cad_premises` / `cad_parking` таблиц нет. `NSPDClient.get_premises_in_building` / `get_parking_in_complex` методы не добавлены. Зависит от #94 NSPD client foundation. Sprint 1.1 done (TIER 3 risk + TIER 4 opportunity), но per-flat / parking layers (38489/38490) пока не входили в PR1-4 scope. Issue остаётся в backlog priority/high — открывает D6 obj_class cross-check + recommend_mix parking signal.
Collaborator

MVP merged (PR #1326, 2026-06-14). Оживлён мёртвый foundation list_objects_in_building (был невызываем из-за бага NSPDOptions.objdocId camelCase). premises_lookup.get_building_premises(cad_num) + parking_ratio (машино-места/помещения) — on-demand, graceful, verified live на 66:41:0106036:183.

Остаётся для полного acceptance (отдельные echelon-задачи, не blocked — просто следующий шаг):

  1. domrf↔cad_buildings geom-match — конкуренты в analyze приходят из ДОМ.РФ (obj_id+lat/lon) без cad_num; нужен centroid↔cad_buildings.geom join, чтобы parking_ratio дошёл до конкурентов в отчёте. ~0.5 дня.
  2. per-flat кадастровая стоимость + median cross-check — сбор самих помещений (cad_premises таблица + миграция, database-expert).
  3. Массовый backfill — Celery rate-limited (38k зданий), отдельно.

Сервис готов принять cad_num как только (1) появится. Оставляю open для wiring.

**MVP merged (PR #1326, 2026-06-14).** Оживлён мёртвый foundation list_objects_in_building (был невызываем из-за бага NSPDOptions.objdocId camelCase). `premises_lookup.get_building_premises(cad_num)` + `parking_ratio` (машино-места/помещения) — on-demand, graceful, verified live на 66:41:0106036:183. **Остаётся для полного acceptance (отдельные echelon-задачи, не blocked — просто следующий шаг):** 1. **domrf↔cad_buildings geom-match** — конкуренты в analyze приходят из ДОМ.РФ (obj_id+lat/lon) без cad_num; нужен centroid↔cad_buildings.geom join, чтобы parking_ratio дошёл до конкурентов в отчёте. ~0.5 дня. 2. **per-flat кадастровая стоимость + median cross-check** — сбор самих помещений (cad_premises таблица + миграция, database-expert). 3. **Массовый backfill** — Celery rate-limited (38k зданий), отдельно. Сервис готов принять cad_num как только (1) появится. Оставляю open для wiring.
Sign in to join this conversation.
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#96
No description provided.