Границы регионов без упрощения, чтобы Куркино не считалось по Екатеринбургу #3527
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#3527
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3052-region-polygon-precision"
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?
Что сломалось
Полигоны из #3052 брались с упрощением до 500 метров. Оно спрямляло ровно ту границу Москвы с областью, ради которой полигоны и заводились. Сверка на проде, 277 582 объявления и 48 143 дома:
Первая строка — регрессия, а не косметика. Вызывающий код подставляет вместо None регион по умолчанию, то есть Екатеринбург. Проверено на живом контейнере: Куркино и Новые Химки резолвились в None и получали екатеринбургские коэффициенты.
Что сделано
Границы перекачаны без упрощения вовсе. Вершин стало 42 755 против 2 388, файл вырос до мегабайта. Промежуточный вариант с упрощением до 55 метров тоже замерен, он дешевле по памяти, но оставляет ту же природу дефекта, только мельче.
Стоимость точности снята предпосчётом на импорте модуля. У каждого кольца свой прямоугольник, а рёбра разложены по горизонтальным полосам широты. Луч в ray casting горизонтален, поэтому пересекать его могут только рёбра своей полосы: у внешнего контура области обход падает с 23 511 рёбер до 724 в худшей полосе и до десятков в типичной.
Замер: 3,5 микросекунды на вызов при принятом потолке 100, тест гейтит 150. Индекс занимает 13 МБ, импорт модуля 81 миллисекунда.
None теперь возможен только когда точка вне прямоугольников всех регионов. Если прямоугольник принял, а полигоны нет, выбирается регион с ближайшей границей.
Щелей на границе нет
Скан 2 250 000 точек с шагом около 22 метров по квадрату 0,3 на 0,3 градуса вдоль границы Москвы не нашёл ни одной щели: в исходных данных линии города и области общие. Запасной путь по ближайшей границе остаётся страховкой, а не рабочим механизмом.
Одна контрольная точка была задана мной неверно
Я требовал, чтобы улица Липовой Рощи, 1к3 давала Москву. Проверил обратным геокодированием сам: это квартал «Спутник», Павшино, городской округ Красногорск, Московская область. Точка на 119 метров внутри области, правильный ответ 50. Моё ожидание было следом прямоугольной эпохи, когда долгота Москвы тянулась до 38,10 и накрывала Красногорск.
Проверено
pytest -k "region or polygon or 3051 or 3052"— 220 passed, 1 skipped. ruff check и format чисты. Остальные контрольные точки сходятся: Куркино, Митино, Косино и Можайский дают 77, Химки, Новые Химки, Красногорск и Новоивановское дают 50, Зеленоград и Троицк 77, Балашиха и Серпухов 50, Екатеринбург 66, Пермь None.