baldav/docs/session-logs/2026-09-30_gapfill-ridden-router.md
4aiman 93908e3365 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).
2026-09-30 00:23:28 +03:00

3 KiB
Raw Blame History

Сессия 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-км нажать 🧩, убедиться, что разрывы по проеханным дорогам теперь достраиваются (голубым по реальной дороге), а сообщение по недостроенным

  • понятное. Отдельно: где не ехал - остаётся честный отказ.