UNPKG

gpx-builder

Version:
87 lines (83 loc) 2.95 kB
import { create } from 'xmlbuilder2'; import BaseBuilder from '../builder/BaseBuilder/BaseBuilder.js'; import Link from '../builder/BaseBuilder/models/Link.js'; import Route from '../builder/BaseBuilder/models/Route.js'; import Point from '../builder/BaseBuilder/models/Point.js'; import Track from '../builder/BaseBuilder/models/Track.js'; import Segment from '../builder/BaseBuilder/models/Segment.js'; /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-argument */ const getArrayOrNothing = source => { if (Array.isArray(source)) { return source; } if (source) { return [source]; } return undefined; }; const getPoints = source => { return getArrayOrNothing(source)?.map(item => { return new Point(Number(item['@lat']), Number(item['@lon']), { ageofdgpsdata: item.ageofdgpsdata != null ? Number(item.ageofdgpsdata) : undefined, cmt: item.cmt, desc: item.desc, dgpsid: item.dgpsid != null ? Number(item.dgpsid) : undefined, ele: item.ele != null ? Number(item.ele) : undefined, fix: item.fix != null ? Number(item.fix) : undefined, geoidheight: item.geoidheight != null ? Number(item.geoidheight) : undefined, hdop: item.hdop != null ? Number(item.hdop) : undefined, link: item.link ? new Link(item.link['@href']) : undefined, magvar: item.magvar != null ? Number(item.magvar) : undefined, name: item.name, pdop: item.pdop != null ? Number(item.pdop) : undefined, sat: item.sat != null ? Number(item.sat) : undefined, src: item.src, sym: item.sym, time: item.time ? new Date(item.time) : undefined, type: item.type, vdop: item.vdop != null ? Number(item.vdop) : undefined }); }) || []; }; const getRoutes = source => { return getArrayOrNothing(source)?.map(item => { return new Route({ name: item.name, rtept: getPoints(item.rtept) }); }); }; const getSegments = source => { return getArrayOrNothing(source)?.map(item => { return new Segment(getPoints(item.trkpt)); }); }; const getTracks = source => { return getArrayOrNothing(source)?.map(item => { return new Track(getSegments(item.trkseg), { name: item.name }); }); }; // eslint-disable-next-line canonical/id-match const _experimentalParseGpx = gpx => { const parsed = create(gpx).toObject(); if (!parsed.gpx) { throw new Error('Invalid format.'); } const gpxData = new BaseBuilder(); const routes = getRoutes(parsed.gpx.rte); if (routes) { gpxData.setRoutes(routes); } const waypoints = getPoints(parsed.gpx.wpt); if (waypoints.length) { gpxData.setWayPoints(waypoints); } const tracks = getTracks(parsed.gpx.trk); if (tracks) { gpxData.setTracks(tracks); } return gpxData; }; export { _experimentalParseGpx };