fix(route-builder): use Swisstopo elevations for snapped routes
routeWaypoints passed BRouter's coarse, SRTM-based inline elevations straight through, and the client only queried Swisstopo when a point lacked an altitude — so snapped routes never hit the Swiss terrain model and shipped a jagged profile that disagreed with the densified off-trail path. Overwrite every routed point with enrichElevations (geo.admin.ch), keeping the router's value only as a fallback where Swisstopo returns null (hikes abroad). Disk-cached by coordinate list, so repeat snaps stay free.
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "homepage",
|
"name": "homepage",
|
||||||
"version": "1.84.0",
|
"version": "1.84.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -217,6 +217,25 @@ export async function routeWaypoints(opts: {
|
|||||||
clearTimeout(timeout);
|
clearTimeout(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Swisstopo is the authoritative elevation source. BRouter ships its own
|
||||||
|
// (coarse, SRTM-based) elevations inline, which made snapped routes carry a
|
||||||
|
// jagged profile that disagreed with the densified off-trail path. Overwrite
|
||||||
|
// every point with the Swiss terrain model; coordinates outside Switzerland
|
||||||
|
// come back `null` and keep the router's elevation as a fallback (hikes
|
||||||
|
// abroad). `enrichElevations` is disk-cached by coordinate list, so repeated
|
||||||
|
// snaps are free.
|
||||||
|
const flat = segments.flat();
|
||||||
|
if (flat.length > 0) {
|
||||||
|
const elevs = await enrichElevations(flat.map((p) => [p[0], p[1]] as [number, number]));
|
||||||
|
let idx = 0;
|
||||||
|
for (const seg of segments) {
|
||||||
|
for (let i = 0; i < seg.length; i++) {
|
||||||
|
const e = elevs[idx++];
|
||||||
|
if (typeof e === 'number') seg[i] = [seg[i][0], seg[i][1], e];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const source = sources.size === 1 ? [...sources][0] : 'mixed';
|
const source = sources.size === 1 ? [...sources][0] : 'mixed';
|
||||||
return { segments, source };
|
return { segments, source };
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user