Gap-fill: bridge dropouts over your own ridden roads first, public BRouter only as fallback

fillGaps used the public BRouter shortest only, so a dropout where you rode
a trail/track absent from OSM was left unbridged (detour >2x or noroute),
even though your own track went straight through. Add opts.routeFn: the
detail view now tries rideRoute (the ride-graph over your tracks) first and
falls back to public BRouter only where you've never ridden. A ridden bridge
is trusted as-is (no detour-too-long rejection); public routing keeps that
guard. Clearer 'not bridged' message split by reason (public detour vs no
road data).
This commit is contained in:
4aiman 2026-09-30 00:23:28 +03:00
commit 93908e3365
3 changed files with 63 additions and 10 deletions

View file

@ -0,0 +1,30 @@
# Сессия 2026-09-30 - достройка пропусков предпочитает проеханные дороги
## Проблема (замечание пользователя)
Достройка отказывалась мостить разрыв там, где реально проезжал (есть два проезда), с
сообщением "больше нужного"/"нет данных". Причина: `GPS.fillGaps` звал только публичный BRouter
"shortest" по OSM и ничего не знал о собственных треках пользователя. В проекте уже есть router
по проеханным дорогам (`rideRoute`, `get_ride_graph`), которым пользуется редактор маршрутов, но
достройка к нему не была подключена. Отсюда: где ехал по тропе/грунту (нет в OSM) - публичный
BRouter либо в объезд > 2x, либо noroute.
## Фикс
- `GPS.fillGaps(points, opts)` (gps.js): добавлен `opts.routeFn(a,b) -> {points, ridden}`; дефолт -
публичный BRouter. Для `ridden:true` (путь по проеханным дорогам) НЕ применяется гвард "объезд
> 2x" - проеханный путь это факт, а не крюк (`rideRoute` и так ограничивает себя 2.5x). Каждому
разрыву в `gaps[]` пишется `ridden`.
- Место вызова (main.js, деталь трека): `routeFn` = `rideRoute` сначала, публичный BRouter
fallback. Так: есть моя дорога -> по ней; нет -> публичное; фэйл (в объезд / нет данных)
остаётся, но с понятным сообщением.
- Сообщение (drawGapPatches + панель): скипы считаются раздельно (skipped-long / skipped-noroute)
и словами: "Не достроено: N (нет твоей проеханной дороги; K — публичный маршрут уводит в объезд,
L — нет дорожных данных)."
## Оговорка
Если участок проезжен ТОЛЬКО в этой поездке (где сам разрыв - точек нет), в ride-графе его нет,
идёт fallback на публичный BRouter (как раньше). Ожидаемо: не ехал по другим - нельзя достроить.
## Проверка
Синтаксис ок. Собрать + телефон: на воскресном 60-км нажать 🧩, убедиться, что разрывы по
проеханным дорогам теперь достраиваются (голубым по реальной дороге), а сообщение по недостроенным
- понятное. Отдельно: где не ехал - остаётся честный отказ.