From e83c330ac52e18f69d839e2f242cac19770e5233 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Fri, 26 Apr 2024 22:35:42 +0200 Subject: [PATCH] surface --- gpx/src/gpx.ts | 13 +++++++++ website/src/lib/components/routing/Routing.ts | 28 ++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gpx/src/gpx.ts b/gpx/src/gpx.ts index 815ea213..77dbb721 100644 --- a/gpx/src/gpx.ts +++ b/gpx/src/gpx.ts @@ -503,6 +503,19 @@ export class TrackPoint { getSurface(): string { return this.extensions && this.extensions["gpxtpx:TrackPointExtension"] && this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"] && this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"].surface ? this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"].surface : undefined; } + + setSurface(surface: string): void { + if (!this.extensions) { + this.extensions = {}; + } + if (!this.extensions["gpxtpx:TrackPointExtension"]) { + this.extensions["gpxtpx:TrackPointExtension"] = {}; + } + if (!this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"]) { + this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"] = {}; + } + this.extensions["gpxtpx:TrackPointExtension"]["gpxtpx:Extensions"]["surface"] = surface; + } }; export class Waypoint { diff --git a/website/src/lib/components/routing/Routing.ts b/website/src/lib/components/routing/Routing.ts index 66ef7e2e..28ee6ffb 100644 --- a/website/src/lib/components/routing/Routing.ts +++ b/website/src/lib/components/routing/Routing.ts @@ -42,6 +42,14 @@ async function getRoute(points: Coordinates[], brouterProfile: string, privateRo let route: TrackPoint[] = []; let coordinates = geojson.features[0].geometry.coordinates; + let messages = geojson.features[0].properties.messages; + + const lngIdx = messages[0].indexOf("Longitude"); + const latIdx = messages[0].indexOf("Latitude"); + const tagIdx = messages[0].indexOf("WayTags"); + let messageIdx = 1; + let surface = getSurface(messages[messageIdx][tagIdx]); + for (let i = 0; i < coordinates.length; i++) { let coord = coordinates[i]; route.push(new TrackPoint({ @@ -51,7 +59,25 @@ async function getRoute(points: Coordinates[], brouterProfile: string, privateRo }, ele: coord[2] ?? undefined })); + route[route.length - 1].setSurface(surface) + + if (messageIdx < messages.length && + coordinates[i][0] == Number(messages[messageIdx][lngIdx]) / 1000000 && + coordinates[i][1] == Number(messages[messageIdx][latIdx]) / 1000000) { + messageIdx++; + + if (messageIdx == messages.length) surface = "missing"; + else surface = getSurface(messages[messageIdx][tagIdx]); + } } return route; -} \ No newline at end of file +} + +function getSurface(message: string): string { + const fields = message.split(" "); + for (let i = 0; i < fields.length; i++) if (fields[i].startsWith("surface=")) { + return fields[i].substring(8); + } + return "unknown"; +}; \ No newline at end of file