Регион точки резолвится по настоящей границе, а не по прямоугольнику (#3052) #3522
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3522
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/3052-region-polygons"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3052.
Проблема
region_for_pointотносил точку к региону поbbox_region— прямоугольнику. Прямоугольники Москвы и области пересекаются, поэтому Химки, Реутов, Котельники и Люберцы получали код 77: московский коэффициент перехода к цене сделки (0.7596 вместо 0.8973 области) и индекс локации, посчитанный по московской медиане, то есть −20% ни за что.Замер на проде: 8 647 московских лотов лежат вне продуктового ядра, 11 172 сделки области попадают внутрь московского ядра.
Решение
Граница региона теперь настоящая — полигоны OSM/Nominatim лежат рядом с модулем в
region_boundaries/boundaries.geojson.json(ODbL, поля_source/_licenseсохранены внутри файла). Резолв идёт в два уровня: дешёвый bbox-предфильтр, затем ray casting по всем кольцам геометрии сразу, even-odd. Плоский список колец одинаково закрывает и дыры полигона области (Москва вырезана одной из девяти), и несвязные части мультиполигона Москвы.Новых зависимостей нет, shapely в tradein-mvp отсутствует и не добавлен. Геометрия парсится один раз на импорте модуля.
bbox_regionостался как предфильтр,geocoder.pyиmsk_raw_import.pyне тронуты.Проверено
Девять контрольных точек резолвятся ровно в один регион каждая: Химки, Балашиха и Серпухов в 50, центр Москвы, Ломоносовский проспект, Зеленоград и Троицк в 77, Екатеринбург в 66, Пермь в None.
Скорость 25 мкс на вызов на 240 тысячах точек, в четыре раза дешевле принятого потолка.
pytest tests/— 6107 passed, 43 skipped. ruff check и format чисты.Про исключение (50, 77) в тесте непересечения
Оно осталось и теперь объяснено в коде. Тот тест проверяет сырые прямоугольники, а
bbox_regionМосквы остаётся подмножеством прямоугольника области независимо от полигонов — полигон работает после предфильтра, а не вместо него. Честная непересекаемость по итоговому резолву проверена отдельным тестомtest_3052_region_polygon_boundary.py. Тест, который раньше фиксировал Химки как known limitation, теперь фиксирует исправленное поведение.