Extract shared extractWaypoints into @trails-cool/gpx

Both new.tsx and api.sessions.ts had duplicated track-segment
waypoint extraction logic. Moved to packages/gpx as
extractWaypoints(gpxData) — uses <wpt> elements when present,
falls back to start of each track segment + end of last.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-02 20:47:17 +01:00
parent e0f7c5b806
commit cc90c32a0e
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
4 changed files with 39 additions and 50 deletions

View file

@ -1,3 +1,4 @@
export { parseGpxAsync } from "./parse.ts";
export { generateGpx } from "./generate.ts";
export { extractWaypoints } from "./waypoints.ts";
export type { GpxData, TrackPoint, ElevationProfile } from "./types.ts";

View file

@ -0,0 +1,33 @@
import type { GpxData } from "./types.ts";
/**
* Extract waypoints from parsed GPX data.
* Uses explicit <wpt> elements if present, otherwise extracts the start
* of each track segment + end of the last segment.
*/
export function extractWaypoints(gpxData: GpxData): Array<{ lat: number; lon: number; name?: string }> {
if (gpxData.waypoints.length > 0) return gpxData.waypoints;
if (gpxData.tracks.length === 0) return [];
const result: Array<{ lat: number; lon: number }> = [];
for (const seg of gpxData.tracks) {
if (seg.length === 0) continue;
const first = seg[0]!;
const prev = result[result.length - 1];
if (!prev || prev.lat !== first.lat || prev.lon !== first.lon) {
result.push({ lat: first.lat, lon: first.lon });
}
}
// Add end of last segment
const lastSeg = gpxData.tracks[gpxData.tracks.length - 1]!;
if (lastSeg.length > 0) {
const last = lastSeg[lastSeg.length - 1]!;
const prev = result[result.length - 1];
if (!prev || prev.lat !== last.lat || prev.lon !== last.lon) {
result.push({ lat: last.lat, lon: last.lon });
}
}
return result;
}