baldav/docs/session-logs/2026-10-26_elevation-slope-brouter.md

7.3 KiB
Raw Blame History

2026-10-26 - Точность высот/уклона в предпросмотре + безопасность маршрутов (brouter)

Работали по утверждённому плану docs/plans/ (финальный вариант - см. ниже «План»). Пять пунктов по предпросмотру маршрута и маршрутизации. Телефон в ходе работы отключился - часть проверок на устройстве ждёт переподключения (отмечено).

Что сделано (по пунктам плана)

П.2 - направленная раскраска спусков (коммит 27c60a4)

routeSlopeColor стала знакочувствительной: подъём - тёплый веер (green->yellow->red->brown->black), спуск по направлению движения - холодный (green->cyan->blue->navy). Легенда показывает обе шкалы. Один общий routeSlopeColor/drawRoutePolyline -> чинит везде (превью, деталь трека, редактор, оверлей на записи). Проверка на устройстве: ЖДЁТ (нужен реальный маршрут с рельефом).

П.1 - уклон по дистанционному окну (коммит 80ddff9)

GPS.routeElevStats: grades[i] теперь центральная разность высоты по РАССТОЯНИЮ окном ~30м (config gradeWindowM), а не между соседними точками. Ступенька ячейки DEM (30м) размазывается по ячейке - уходит ложный крутой уклон на одном коротком сегменте. maxGrade - по тем же. «Не рисует где есть» - предел разрешения SRTM 30м, не чинится без более точного DEM (улучшает П.5). Проверка: ЖДЁТ устройство.

П.4 - объезд ↪ только при реальном затыке впереди (коммит ac37f36)

rejoinReroute: (а) прогресс = ближайшая точка маршрута к позиции; (б) направление по компасу; (в) объезд строится ТОЛЬКО если nogo реально на маршруте впереди в окне ~2.5км, иначе toast «впереди затыка нет». Цель - первая точка за nogo + 300м. Раньше строил всегда и прыгал «к первому вейпоинту» (глобально ближайшая точка на петле). Проверка: ЖДЁТ устройство (поставить nogo впереди/без nogo).

П.5 - поправка высот по проездам: база SRTM + медиана как сдвиг (коммит 0d5a598)

Rust get_elev_correction(minPasses): по ячейке ~20м медиана (altitude_gps_m − altitude_srtm_m) по >= N разным сессиям-проездам. SRTM остаётся базой; это только сдвиг вверх/вниз там, где катал. JS applyRiddenElevCorrection применяет сглаженную дельту к высотам маршрута в превью (showRouteDetail), недеструктивно (копия; нет покрытия -> без изменений). Порог проездов - localStorage baldav_elev_corr_passes (деф. 3). Проверка: ЖДЁТ (ячейки с многими проездами).

П.3 - brouter: ИЗБЕГАТЬ (Part A, коммит 85aa87e). Part B - следующим заходом.

Профиль trekking.brf (asset + staging синхронно): штраф на броды (ford=yes|stepping_stones, node и way), tracktype=grade5, trail_visibility=bad|horrible|no; тумблер %allow_adventure% (деф. false = избегать). Теги подтверждены в lookups.dat. Синтаксис сверен с грамматикой BRouter, но локального brouter-jar нет -> ПРОВЕРКА СИНТАКСИСА только маршрутизацией на устройстве (ошибка профиля = routeBrouter бросает ошибку = безопасный отказ, не кривой маршрут).

П.3 Part B - СДЕЛАНО (коммит 109879a) + фикс avoidance

Спайк пройден: brouter отдаёт теги путей. В geojson (format=geojson) в properties.messages есть колонки WayTags/NodeTags на сегмент; on-device btools (brouter-1.6.3-all.jar) имеет formatAsGeoJson. Реализовано:

  • brouter_route (Rust) + routeBrouter (Kotlin) - параметр format; при geojson возвращается formatAsGeoJson (GPX-путь не тронут).
  • BRouter.routeGeoJson + GPS.parseRouteGeoJson - геометрия + опасности (ford / grade5|плохая тропа / паром) из тегов.
  • Редактор маршрута: дорожные ноги строятся через geojson, броды (cyan) и грунт/тропы (orange) помечаются на карте + счётчик «⚠ брод/грунт»; тумблер «Броды: избегать/разрешить» (trekking / trekking-adventure) + ре-роутинг.
  • Профиль trekking-adventure.brf (allow_adventure=true), asset+staging+стенд .18.

Фикс avoidance (коммит 640429a): штраф за брод сидел в way-initialcost и НЕ менял cost (проверено на .18: avoid и adventure давали одинаковый cost). Перенёс в costfactor.

Проверено на домашнем портале 192.168.1.18 (реальный брод 47.5387,40.3164):

  • trekking (avoid): 6199м в обход, fords=0; trekking-adventure: 1418м через брод, fords=1.
  • GPS.parseRouteGeoJson на реальном ответе .18: 42 точки, 1 брод на 47.53867,40.31637 (твой).
  • Профиль ПАРСИТСЯ (синтаксис валиден). Профили задеплоены на .18 (бэкап trekking.brf.bak-*).

НЕ проверено (телефон отключился)

  • На УСТРОЙСТВЕ: П.1/П.2/П.4/П.5 + редактор (маркеры опасности, тумблер adventure) + on-device geojson-путь routeBrouter. Собрано (build 0.1.531), компилируется. Ставить при переподключении.
  • 2-й брод (47.4926,39.8610) - тестовые точки его не пересекли, тест неинформативен (не провал).

Критичные места (для продолжения)

  • frontend/js/gps.js: routeElevStats (grades окно), filterAndSmoothAlt.
  • frontend/js/main.js: routeSlopeColor/ROUTE_SLOPE_UP/ROUTE_SLOPE_DOWN/slopeLegendHtml, drawRoutePolyline, rejoinReroute, loadElevCorrection/applyRiddenElevCorrection.
  • src-tauri/src/lib.rs: get_elev_correction.
  • .../assets/brouter/profiles2/trekking.brf (+ tools/brouter-web-staging/profiles2/trekking.brf).
  • MainActivity.kt routeBrouter (для Part B - messageList).