feat(mera): слой ДТП (dtp-stat/ГИБДД) в PostGIS + радиусные агрегаты #3428
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3428
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/mera-dtp-layer"
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?
Что и зачем
Первая локационная фича вне OSM. Открытая выгрузка по Свердловской области — GeoJSON, 5 МБ zip / ~71 МБ распакованных, 31 253 ДТП за 2015-01…2026-01, из них ~15 тыс. с адресом в Екатеринбурге. Потоковый парс через
ijson, файл целиком в память не читается.Атрибуты богаче ожидаемого: тяжесть, категория, погибшие/раненые, освещение, погода, объекты УДС рядом.
Агрегаты в радиусе — bbox-префильтр +
ST_DWithin(geom::geography, …), с функциональным GIST по(geom::geography): обычный GIST по geometry планировщик под такой предикат не берёт (замеры миграций 270 и 134 — 180 мс → 38 мс). Пустая таблица →status="unavailable", а не 500 и не сфабрикованные нули.Персональные данные
В
vehicles[].participants[]лежат пол, роль и нарушения физлиц. Не сохраняем — ни колонкой, ни вraw-jsonb. Зафиксировано в миграции и докстринге, покрыто тестом на реальной записи.Отдельно: моя первая проверка «утечки» дала 74 совпадения, но все они оказались из названия категории ГИБДД «Наезд на лицо, не являющееся участником дорожного движения» — ложная тревога, фильтр корректен.
Найденное на реальных данных
Битые координаты источника. Из 31 253 записей 86 лежат вне региона, в том числе 10 ровно в
(0,0)и такие значения, как(1.0, 1.0)и(41.0, 47.0). Слой кормит радиусные агрегаты локации, пускать туда мусор нельзя — режем на парсе.Санити-рамка намеренно шире официальных границ области (55.0–63.5 N, 56.0–67.5 E), чтобы не срезать легитимный север (~63°). После фильтра остаётся 31 167 записей.
Границы
dtp_indexпока не подключён ни к одному эндпоинту — потребитель отдельным PR.estimator.pyне тронут.Дамп источника заморожен на
Last-Modified 2026-02-26— зафиксировано в докстринге, чтобы пустая дельта не читалась как баг загрузчика.Проверка
ruff check— чисто; полный сьютpytest— 5 647 passed, 37 skipped. Парсер прогнан на реальном 71 МБ GeoJSON.Миграции 294 (таблица + индексы) и 295 (сид расписания,
enabled=false,interval_days30). Новая зависимость:ijson.