Границы регионов без упрощения, чтобы Куркино не считалось по Екатеринбургу #3527

Merged
lekss361 merged 1 commit from fix/3052-region-polygon-precision into main 2026-09-15 07:22:33 +00:00
Owner

Что сломалось

Полигоны из #3052 брались с упрощением до 500 метров. Оно спрямляло ровно ту границу Москвы с областью, ради которой полигоны и заводились. Сверка на проде, 277 582 объявления и 48 143 дома:

Дефект Сколько
Ни один полигон не принял точку агломерации 69
Митино, Косино-Ухтомский, Можайский ушли в область 27 домов
Объявления области ушли в Москву 731

Первая строка — регрессия, а не косметика. Вызывающий код подставляет вместо 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.

## Что сломалось Полигоны из #3052 брались с упрощением до 500 метров. Оно спрямляло ровно ту границу Москвы с областью, ради которой полигоны и заводились. Сверка на проде, 277 582 объявления и 48 143 дома: | Дефект | Сколько | |---|---| | Ни один полигон не принял точку агломерации | 69 | | Митино, Косино-Ухтомский, Можайский ушли в область | 27 домов | | Объявления области ушли в Москву | 731 | Первая строка — регрессия, а не косметика. Вызывающий код подставляет вместо 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.
lekss361 added 1 commit 2026-09-15 07:16:16 +00:00
fix(tradein): границы регионов без упрощения + индекс колец в region_for_point
All checks were successful
CI Trade-In / changes (pull_request) Successful in 15s
CI / changes (pull_request) Successful in 17s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / browser-tests (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 5m4s
48f5dffa2e
polygon_threshold=0.005 (~500 м) спрямлял ровно ту границу Москвы с областью,
ради которой полигоны и заводились: 69 точек агломерации не принимал ни один
полигон (None → DEFAULT_REGION_CODE=66), Митино/Косино/Можайский уезжали в
область, 731 объявление области — в Москву. Границы перекачаны без упрощения
(42 755 вершин против 2 388). Стоимость снята предпосчётом: bbox каждого
кольца + нарезка рёбер на lat-полосы — 3.5 мкс/вызов при потолке 100.
None теперь законен только вне bbox всех регионов; если прямоугольник принял,
а полигоны нет, выбирается регион с ближайшей границей.
lekss361 merged commit 967f2b53ba into main 2026-09-15 07:22:33 +00:00
lekss361 deleted branch fix/3052-region-polygon-precision 2026-09-15 07:22:33 +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#3527
No description provided.