Загрузчик точек интереса берёт регион параметром, а не только Екатеринбург #3524

Merged
lekss361 merged 2 commits from feat/msk-osm-poi into main 2026-09-15 07:05:22 +00:00
Owner

Проблема

Прямоугольник загрузки был зашит константой EKB_BBOX, поэтому в реестре точек интереса нет ни одной московской записи, и блок «что рядом» в индексе локации по Москве молчал.

Решение

Появился реестр REGION_BBOX с ключами ekb и msk, значение по умолчанию везде ekb. Существующее недельное расписание вызывает загрузчик без аргумента и поведения не меняет.

Прямоугольник Москвы продублирован явно, а не подтянут кросс-импортом: Site Finder — независимая половина монорепо со своей базой, у trade-in свой реестр регионов. Значение равно продуктовому ядру региона 77, пересчитанному в тот же порядок координат.

Защита от тихой обрезки

Живой пробный запрос показал, что риск реален. В московском ядре 12 181 остановка автобуса — больше, чем все четырнадцать категорий Екатеринбурга вместе, а их 4 850. Один плиточный запрос размером с Екатеринбург по этой категории вернул 504.

Единый безопасный размер плитки заранее не подобрать: плотность по городу неравномерна, а заголовка «это неполный ответ» у Overpass нет. Поэтому плитка, дважды упавшая, режется на четыре четверти и перезапрашивается рекурсивно до глубины три, вместо того чтобы молча потерять данные. Для Екатеринбурга это ровно одна плитка, совпадающая со старым прямоугольником, и рекурсия там не срабатывает никогда.

Имя таблицы

osm_poi_ekb оставлено как есть. Таблицу читают ещё два места вне Site Finder: внешняя таблица gendesign_osm_poi_ekb и локальное зеркало в trade-in. Переименование потянуло бы миграции обеих половин монорепо ради косметики.

Задача обновления зеркала правки не потребовала: там безусловный полный скан без фильтра по прямоугольнику, московские точки подхватятся тем же кодом на ближайшем ежедневном прогоне.

Проверено

pytest tests/test_poi_loader.py — 9 passed, HTTP и паузы замоканы. Более широкий срез — 307 passed, 1 skipped. ruff чист.

Сама загрузка Москвы в прод — отдельный шаг, sync_poi_to_db(region="msk"), запускается после мержа.

## Проблема Прямоугольник загрузки был зашит константой `EKB_BBOX`, поэтому в реестре точек интереса нет ни одной московской записи, и блок «что рядом» в индексе локации по Москве молчал. ## Решение Появился реестр `REGION_BBOX` с ключами `ekb` и `msk`, значение по умолчанию везде `ekb`. Существующее недельное расписание вызывает загрузчик без аргумента и поведения не меняет. Прямоугольник Москвы продублирован явно, а не подтянут кросс-импортом: Site Finder — независимая половина монорепо со своей базой, у trade-in свой реестр регионов. Значение равно продуктовому ядру региона 77, пересчитанному в тот же порядок координат. ## Защита от тихой обрезки Живой пробный запрос показал, что риск реален. В московском ядре 12 181 остановка автобуса — больше, чем все четырнадцать категорий Екатеринбурга вместе, а их 4 850. Один плиточный запрос размером с Екатеринбург по этой категории вернул 504. Единый безопасный размер плитки заранее не подобрать: плотность по городу неравномерна, а заголовка «это неполный ответ» у Overpass нет. Поэтому плитка, дважды упавшая, режется на четыре четверти и перезапрашивается рекурсивно до глубины три, вместо того чтобы молча потерять данные. Для Екатеринбурга это ровно одна плитка, совпадающая со старым прямоугольником, и рекурсия там не срабатывает никогда. ## Имя таблицы `osm_poi_ekb` оставлено как есть. Таблицу читают ещё два места вне Site Finder: внешняя таблица `gendesign_osm_poi_ekb` и локальное зеркало в trade-in. Переименование потянуло бы миграции обеих половин монорепо ради косметики. Задача обновления зеркала правки не потребовала: там безусловный полный скан без фильтра по прямоугольнику, московские точки подхватятся тем же кодом на ближайшем ежедневном прогоне. ## Проверено `pytest tests/test_poi_loader.py` — 9 passed, HTTP и паузы замоканы. Более широкий срез — 307 passed, 1 skipped. ruff чист. Сама загрузка Москвы в прод — отдельный шаг, `sync_poi_to_db(region="msk")`, запускается после мержа.
lekss361 added 2 commits 2026-09-15 06:36:45 +00:00
Блок «что рядом» в оценке молчал для Москвы — poi_loader.py тянул Overpass
строго по EKB_BBOX константе. Параметризовал регионом: REGION_BBOX содержит
"ekb" (дефолт, поведение weekly-расписания tasks.poi_sync.sync_osm_poi_ekb не
меняется) и "msk" (bbox_product_core региона 77 из tradein-mvp regions.py,
продублирован явно — Site Finder не импортирует tradein-mvp).

Живой замер Overpass (13.09.2026, count-only + один тайл) показал, что просто
разрешить region было бы недостаточно: в Москве 12 181 bus_stop — больше, чем
ВСЕ 14 категорий ЕКБ вместе (4 850) — и уже один uniform-тайл 0.25×0.25° (размер
ЕКБ) вернул 504 на этой категории. Единый безопасный размер тайла заранее не
подобрать — плотность Москвы неравномерна (плотный центр / разреженная
периферия), а у Overpass нет сигнала "это частичный ответ", кроме HTTP-ошибки.
Поэтому вместо фиксированного тайла — адаптивное дробление: тайл, дважды
упавший в Overpass, дробится на 4 четверти и перезапрашивается рекурсивно (до
RECURSIVE_SPLIT_MAX_DEPTH=3), вместо того чтобы тихо потерять данные по тайлу.
Для ЕКБ (единственный тайл исторически всегда отвечал 200) рекурсия не
срабатывает — поведение дефолта не меняется.

Таблицу osm_poi_ekb НЕ переименовывал: она читается ещё в двух местах вне
Site Finder (FDW gendesign_osm_poi_ekb + локальное зеркало osm_poi_ekb_local
в tradein), переименование задело бы миграции обеих половин ради красоты
имени. tradein-mvp/backend/app/tasks/osm_poi_ekb_refresh.py менять не
потребовалось — зеркало уже делает безусловный full-scan FDW-таблицы без
фильтра по bbox, так что московские точки подхватятся тем же кодом.

Загрузку Москвы в прод не запускал — по заданию это делает главная сессия:
sync_poi_to_db(region="msk").
docs(poi): убрать ссылку на несуществующий ADR
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 16s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m58s
CI / backend-tests (pull_request) Successful in 7m19s
65609f1083
Комментарий отправлял к «ADR в vault decisions/», которого нет. Причина
сохранения имени osm_poi_ekb теперь изложена на месте.
lekss361 merged commit a83418799c into main 2026-09-15 07:05:22 +00:00
lekss361 deleted branch feat/msk-osm-poi 2026-09-15 07:05:22 +00:00
Sign in to join this conversation.
No reviewers
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#3524
No description provided.