Геокодирование сделок области: ключ (регион, НП, улица) вместо голой улицы #3532

Merged
lekss361 merged 1 commit from fix/oblast-deal-geocoding into main 2026-09-15 17:28:09 +00:00

1 commit

Author SHA1 Message Date
bot-backend
6e184fe8fc Ключ центроида — (регион, НП, улица), иначе Луговая из Сабурово садится в Красногорск
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 15s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m32s
geocode_deals_from_houses строил карту центроидов по ВСЕМ houses без фильтра
региона, а ключом было голое имя улицы. По Свердловской области это безвредно
(скрипт жил ЕКБ-only, с хардкодом ^екатеринбург$), по Московской — тихая
катастрофа: «Ленина» / «Центральная» / «Луговая» есть почти в каждом из ~970
НП области, дома со всех одноимённых улиц слипались бы в одно ведро, а среднее
их координат — правдоподобная точка ПОСЕРЕДИНЕ между городами.

- ключ join'а = (region_code, населённый пункт, улица); НП разбирается по типу
  («г Химки», «д Сабурово») или по реестру REGIONS[rc].cities, плюс позиционный
  fallback под формат deals.address по области («Сабурово, Луговая»);
  у deals НП берётся из колонки city (заполнена на 100%).
- фильтр региона в выборке кандидатов, в карте центроидов и в UPDATE;
  houses.region_code IS NULL принимается по bbox_region реестра, deals.region_code
  IS NULL — только для 66 (строки до миграции 177 по построению екатеринбургские).
- sanity-чек разброса: ведро, где дом отстоит от центроида дальше --max-spread-km
  (5 км), выбрасывается — это склейка нескольких НП, а не улица.
- пустой НП у региона без города-ядра (50) → ключа нет; подставлять «Красногорск»
  нельзя, это та же ловушка уровнем выше.

geocoder: регион 50 получил маркер state «московская» (не «москва» — иначе
результат внутри города Москвы, который щедрый bbox_region области накрывает
целиком, принимался бы за областной), имя региона DaData «Московская» и запрет
dual-query с суффиксом главного города (Region.has_city_core=False).
2026-09-15 19:35:36 +03:00