feat: improve voice guidance

This commit is contained in:
Cfp
2025-06-27 14:31:48 +02:00
parent a5911122cd
commit c344c581b7

View File

@ -2,12 +2,20 @@ import { OVERPASS_SERVER } from "../hosts";
import type { OverpassResult } from "../Overpass"; import type { OverpassResult } from "../Overpass";
export async function generateVoiceGuidance(maneuver: Maneuver, shape: WorldLocation[]): Promise<string> { export async function generateVoiceGuidance(maneuver: Maneuver, shape: WorldLocation[]): Promise<string> {
if(maneuver.begin_shape_index == 0) {
return maneuver.verbal_pre_transition_instruction;
}
if(maneuver.type === 26 || maneuver.type === 27) {
return `Im Kreisverkehr die ${maneuver.roundabout_exit_count}te Ausfahrt nehmen${(maneuver.street_names ?? []).length == 0 ? "." : ` auf ${(maneuver.street_names || []).join(", ")}.`}`;
}
const landmarks = await findNearbyLandmarks(shape[maneuver.begin_shape_index]); const landmarks = await findNearbyLandmarks(shape[maneuver.begin_shape_index]);
if(landmarks.length == 0) { if(landmarks.length == 0) {
return maneuver.verbal_pre_transition_instruction; return maneuver.verbal_pre_transition_instruction;
} }
console.log("Original instruction:", maneuver.verbal_pre_transition_instruction); console.log("Original instruction:", maneuver.verbal_pre_transition_instruction);
return `Hinter ${landmarks[0].tags.name}, ${typeToName(maneuver.type)} auf ${(maneuver.street_names || []).join(", ")}.`; return `Hinter ${landmarks[0].tags.name}, ${typeToName(maneuver.type)}${(maneuver.street_names ?? []).length == 0 ? "." : ` auf ${(maneuver.street_names || []).join(", ")}.`}`;
} }
function typeToName(type: number) { function typeToName(type: number) {
@ -47,9 +55,9 @@ function typeToName(type: number) {
return "Links halten"; return "Links halten";
case 25: case 25:
return "Einordnen"; return "Einordnen";
case 26: // case 26:
case 27: // case 27:
return "Kreisverkehr"; // return "Kreisverkehr";
case 37: case 37:
return "Rechts einordnen"; return "Rechts einordnen";
case 38: case 38:
@ -67,6 +75,8 @@ export async function findNearbyLandmarks(location: WorldLocation) {
method: "POST", method: "POST",
body: `[out:json]; body: `[out:json];
( (
node(around:${radius}, ${lat}, ${lon})["amenity"="fuel"]["name"];
way(around:${radius}, ${lat}, ${lon})["amenity"="fuel"]["name"];
node(around:${radius}, ${lat}, ${lon})["tourism"="artwork"]["name"]; node(around:${radius}, ${lat}, ${lon})["tourism"="artwork"]["name"];
way(around:${radius}, ${lat}, ${lon})["tourism"="artwork"]["name"]; way(around:${radius}, ${lat}, ${lon})["tourism"="artwork"]["name"];
node(around:${radius}, ${lat}, ${lon})["shop"]["name"]; node(around:${radius}, ${lat}, ${lon})["shop"]["name"];