From 678e52ddd56a87cf3edbb00adade455b99911aa0 Mon Sep 17 00:00:00 2001 From: Jannik Date: Sat, 25 Oct 2025 20:08:45 +0200 Subject: [PATCH] feat(routing): use road max speed for verbal pre instruction distance --- src/lib/services/navigation/routing.svelte.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/lib/services/navigation/routing.svelte.ts b/src/lib/services/navigation/routing.svelte.ts index d1e1c92..73db2a7 100644 --- a/src/lib/services/navigation/routing.svelte.ts +++ b/src/lib/services/navigation/routing.svelte.ts @@ -6,6 +6,7 @@ import type { LngLatBoundsLike } from "maplibre-gl"; import { generateVoiceGuidance } from "./VoiceGuidance"; import { keepScreenOn } from "tauri-plugin-keep-screen-on-api"; import { m } from "$lang/messages"; +import { getFeature, getSpeed } from "../TileMeta"; export const routing = $state({ geojson: { @@ -150,6 +151,28 @@ export async function startRoute(trip: Trip) { let hasAnnouncedPreInstruction = false; const USE_LANDMARK_INSTRUCTIONS = false; +let maneuverSpeed = { idx: -1, speed: 50 }; + +async function getSpeedForManeuver(idx: number) { + if (maneuverSpeed.idx === idx) { + return maneuverSpeed.speed; + } + + if (!routing.currentTrip) return 50; + + const esi = routing.currentTrip!.legs[0].maneuvers[idx].end_shape_index; + const shape = routing.currentTrip!.legs[0].shape; + const polyline = decodePolyline(shape); + const point = polyline[esi]; + + const feature = await getFeature(point, "transportation"); + if (!feature || !feature.properties) return 50; + + const speed = getSpeed(feature.properties.maxspeed || "50") || 50; + maneuverSpeed = { idx, speed }; + return speed; +} + async function tickRoute() { const trip = routing.currentTrip; const info = routing.currentTripInfo; @@ -201,7 +224,7 @@ async function tickRoute() { // console.log("Distance to end of current maneuver: ", distanceToEnd, " meters"); // console.log("Speed: ", location.speed, " km/h"); const verbalDistance = verbalPreInstructionDistance( - location.speed || 50, // Assuming location has a speed property + await getSpeedForManeuver(routing.currentTripInfo.maneuverIdx), ); if (distanceToEnd <= verbalDistance) { hasAnnouncedPreInstruction = true;