Москва, часть 2/3: гард по полигону вместо радиуса 3 км — адрес перестаёт быть уникальным по стране #3052

Open
opened 2026-08-22 11:24:14 +00:00 by lekss361 · 0 comments
Owner

Разбиение #2996 · эпик #2989 · зависит от части 1 (#3051) — нужен city_fias_id и region_code у houses

Что не так

Нормализованный адрес считается уникальным по всей стране:

  • house_address_aliasesUNIQUE (normalized_address) без региона
  • geocode_cachePRIMARY KEY (address_normalized) без региона

Код борется с этим костылём _TIER2B_GUARD_M = 3000 в backend/app/services/matching/houses.py. В московской агломерации костыль не работает по построению: улицы с одинаковыми названиями лежат ближе трёх километров.

Поправка проверяющего из #2996: гард заменять не другим радиусом, а принадлежностью полигону населённого пункта — ST_Within плюс совпадение city_fias_id. Тогда радиус перестаёт быть механизмом вообще.

Почему после части 1

ST_Within требует полигонов населённых пунктов, а совпадение по city_fias_id — самого ключа. Ни того, ни другого сейчас нет. Делать полигональный гард раньше — значит писать его поверх несуществующих данных.

Отдельный вопрос, который решается здесь: откуда брать полигоны для Москвы. ekb_districts_geom содержит 8 районов Екатеринбурга и Москву не покрывает. Варианты — ГАР ADDR_OBJ, OSM boundary relations, либо границы из DaData. Выбор зафиксировать в задаче до реализации.

Смежное

  • #2777 — 108 домов сшиты из разных населённых пунктов, та же корневая причина
  • gar_house_flats — 919 341 строка, все с region_code = '66', загрузчик режет по city_filter="Екатеринбург". И это огрызок ГАР: только срез house_guid → flat_count, без иерархии ADDR_OBJ, которая и делает ключи региононейтральными

Приёмка

  • UNIQUE (region_code, normalized_address) в house_address_aliases; то же для geocode_cache
  • _TIER2B_GUARD_M удалён, а не заменён другим числом
  • Гард — ST_Within по полигону населённого пункта + совпадение city_fias_id
  • Источник полигонов для 77 выбран и загружен
  • Тест на паре одноимённых улиц в пределах 3 км в Москве: сшивки не происходит
  • Регрессия на ЕКБ: существующие сопоставления домов не поехали
Разбиение #2996 · эпик #2989 · **зависит от части 1 (#3051)** — нужен `city_fias_id` и `region_code` у `houses` ## Что не так Нормализованный адрес считается уникальным по всей стране: - `house_address_aliases` — `UNIQUE (normalized_address)` без региона - `geocode_cache` — `PRIMARY KEY (address_normalized)` без региона Код борется с этим костылём `_TIER2B_GUARD_M = 3000` в `backend/app/services/matching/houses.py`. В московской агломерации костыль не работает **по построению**: улицы с одинаковыми названиями лежат ближе трёх километров. Поправка проверяющего из #2996: гард заменять не другим радиусом, а принадлежностью полигону населённого пункта — `ST_Within` плюс совпадение `city_fias_id`. Тогда радиус перестаёт быть механизмом вообще. ## Почему после части 1 `ST_Within` требует полигонов населённых пунктов, а совпадение по `city_fias_id` — самого ключа. Ни того, ни другого сейчас нет. Делать полигональный гард раньше — значит писать его поверх несуществующих данных. Отдельный вопрос, который решается здесь: **откуда брать полигоны для Москвы**. `ekb_districts_geom` содержит 8 районов Екатеринбурга и Москву не покрывает. Варианты — ГАР ADDR_OBJ, OSM boundary relations, либо границы из DaData. Выбор зафиксировать в задаче до реализации. ## Смежное - #2777 — 108 домов сшиты из разных населённых пунктов, та же корневая причина - `gar_house_flats` — 919 341 строка, все с `region_code = '66'`, загрузчик режет по `city_filter="Екатеринбург"`. И это огрызок ГАР: только срез `house_guid → flat_count`, без иерархии ADDR_OBJ, которая и делает ключи региононейтральными ## Приёмка - [ ] `UNIQUE (region_code, normalized_address)` в `house_address_aliases`; то же для `geocode_cache` - [ ] `_TIER2B_GUARD_M` удалён, а не заменён другим числом - [ ] Гард — `ST_Within` по полигону населённого пункта + совпадение `city_fias_id` - [ ] Источник полигонов для 77 выбран и загружен - [ ] Тест на паре одноимённых улиц в пределах 3 км в Москве: сшивки не происходит - [ ] Регрессия на ЕКБ: существующие сопоставления домов не поехали
lekss361 added the
bug
data
priority/p1
scope/backend
scope/db
tradein
labels 2026-08-22 11:24:56 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#3052
No description provided.