UNPKG

@sports-alliance/sports-lib

Version:

A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc

83 lines (82 loc) 4.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventExporterGPX = void 0; const data_latitude_degrees_1 = require("../../../data/data.latitude-degrees"); const data_distance_1 = require("../../../data/data.distance"); const data_heart_rate_1 = require("../../../data/data.heart-rate"); const data_cadence_1 = require("../../../data/data.cadence"); const data_temperature_1 = require("../../../data/data.temperature"); const data_power_1 = require("../../../data/data.power"); const data_altitude_1 = require("../../../data/data.altitude"); const data_speed_1 = require("../../../data/data.speed"); const data_longitude_degrees_1 = require("../../../data/data.longitude-degrees"); const data_time_1 = require("../../../data/data.time"); // @ts-ignore const gpx_builder_1 = require("gpx-builder"); const buildGPX = gpx_builder_1.buildGPX; const GarminBuilder = gpx_builder_1.GarminBuilder; const { Point, Metadata, Person: _Person, Copyright, Link, Track, Segment } = GarminBuilder.MODELS; class EventExporterGPX { constructor() { this.fileType = 'application/gpx+xml'; this.fileExtension = 'gpx'; } getAsString(event) { return new Promise((resolve, _reject) => { const tracks = []; event.getActivities().forEach(activity => { // We cannot export activities with no positional data! if (!activity.hasPositionData()) { return; } const timeStream = activity.generateTimeStream([data_latitude_degrees_1.DataLatitudeDegrees.type, data_longitude_degrees_1.DataLongitudeDegrees.type]); // @todo it should make an activity copy activity.addStream(timeStream); const segment = new Segment(activity .getStreamDataTypesBasedOnDataType(data_latitude_degrees_1.DataLatitudeDegrees.type, [ data_longitude_degrees_1.DataLongitudeDegrees.type, data_time_1.DataTime.type, data_distance_1.DataDistance.type, data_heart_rate_1.DataHeartRate.type, data_cadence_1.DataCadence.type, data_temperature_1.DataTemperature.type, data_power_1.DataPower.type, data_altitude_1.DataAltitude.type, data_speed_1.DataSpeed.type ]) .reduce((pointsArray, data, _index, _array) => { pointsArray.push(new Point(data[data_latitude_degrees_1.DataLatitudeDegrees.type], data[data_longitude_degrees_1.DataLongitudeDegrees.type], { ele: data[data_altitude_1.DataAltitude.type] || undefined, time: new Date(activity.startDate.getTime() + data[data_time_1.DataTime.type] * 1000), hr: data[data_heart_rate_1.DataHeartRate.type], power: data[data_power_1.DataPower.type] || undefined, speed: data[data_speed_1.DataSpeed.type] || undefined, atemp: data[data_temperature_1.DataTemperature.type] || undefined, cad: data[data_cadence_1.DataCadence.type] || undefined, extensions: { power: data[data_power_1.DataPower.type] || undefined, distance: data[data_distance_1.DataDistance.type] || undefined } })); return pointsArray; }, [])); tracks.push(new Track([segment], { name: activity.type, type: activity.type })); // @todo it should make an activity copy activity.removeStream(timeStream); }); const builder = new GarminBuilder(); builder.setTracks(tracks); builder.setMetadata(new Metadata({ name: event.name, desc: event.description, // author: new Person, copyright: new Copyright('Quantified-Self.IO ', new Date().getFullYear().toString()), link: new Link('https://quantified-self.io/', { text: 'Quantified Self IO', type: 'Application' }), time: new Date() })); builder.data.attributes.creator = event.getFirstActivity().creator.name; resolve(buildGPX(builder.toObject())); }); } } exports.EventExporterGPX = EventExporterGPX;