From 0f489f1cc9f7bf0a3f21a83ec9b1434aa94c7182 Mon Sep 17 00:00:00 2001 From: "Brian J. Murrell" Date: Sun, 27 Mar 2022 16:34:30 -0400 Subject: [PATCH] Use Cluetrust GPX extension to add total distance To each trackpiont written to the GPX file. Signed-off-by: Brian J. Murrell --- .../io/file/exporter/GPXTrackExporter.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java index cbd0675d0..15ef7124e 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java @@ -37,6 +37,7 @@ import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; +import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.util.StringUtils; @@ -128,6 +129,7 @@ public class GPXTrackExporter implements TrackExporter { private void writeTrackPoints(Track track) throws InterruptedException { boolean wroteTrack = false; boolean wroteSegment = false; + Distance trackDistance = Distance.of(0); LinkedList sensorPoints = new LinkedList<>(); @@ -159,7 +161,7 @@ public class GPXTrackExporter implements TrackExporter { writeOpenSegment(); wroteSegment = true; - writeTrackPoint(track.getZoneOffset(), trackPoint, sensorPoints); + trackDistance = trackDistance.plus(writeTrackPoint(track.getZoneOffset(), trackPoint, sensorPoints, trackDistance)); sensorPoints.clear(); break; case SENSORPOINT: @@ -172,7 +174,7 @@ public class GPXTrackExporter implements TrackExporter { wroteSegment = true; } - writeTrackPoint(track.getZoneOffset(), trackPoint, sensorPoints); + trackDistance = trackDistance.plus(writeTrackPoint(track.getZoneOffset(), trackPoint, sensorPoints, trackDistance)); sensorPoints.clear(); break; default: @@ -225,6 +227,7 @@ public class GPXTrackExporter implements TrackExporter { printWriter.println("xmlns:opentracks=\"http://opentracksapp.com/xmlschemas/v1\""); printWriter.println("xmlns:gpxtpx=\"http://www.garmin.com/xmlschemas/TrackPointExtension/v2\""); printWriter.println("xmlns:gpxtrkx=\"http://www.garmin.com/xmlschemas/TrackStatsExtension/v1\""); + printWriter.println("xmlns:cluetrust=\"http://www.cluetrust.com/Schemas/\""); printWriter.println("xmlns:pwr=\"http://www.garmin.com/xmlschemas/PowerExtension/v1\""); printWriter.println("xsi:schemaLocation=" + "\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" @@ -232,6 +235,7 @@ public class GPXTrackExporter implements TrackExporter { + " http://www.garmin.com/xmlschemas/TrackPointExtension/v2 https://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd" + " http://www.garmin.com/xmlschemas/PowerExtension/v1 https://www8.garmin.com/xmlschemas/PowerExtensionv1.xsd" + " http://www.garmin.com/xmlschemas/TrackStatsExtension/v1" + + " http://www.cluetrust.com/Schemas http://www.cluetrust.com/Schemas/gpxdata10.xsd" + " http://opentracksapp.com/xmlschemas/v1 http://opentracksapp.com/xmlschemas/OpenTracks_v1.xsd\">"); } } @@ -312,7 +316,9 @@ public class GPXTrackExporter implements TrackExporter { printWriter.println(""); } - public void writeTrackPoint(ZoneOffset zoneOffset, TrackPoint trackPoint, List sensorPoints) { + public Distance writeTrackPoint(ZoneOffset zoneOffset, TrackPoint trackPoint, List sensorPoints, Distance trackDistance) { + Distance cumulativeDistance = null; + if (printWriter != null) { printWriter.println(""); @@ -352,9 +358,10 @@ public class GPXTrackExporter implements TrackExporter { trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeLoss) + "\n"); } - Double cumulativeDistance = cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasSensorDistance() ? tp.getSensorDistance().toM() : null); + cumulativeDistance = Distance.of(cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasSensorDistance() ? tp.getSensorDistance().toM() : null)); if (cumulativeDistance != null) { - trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeDistance) + "\n"); + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(cumulativeDistance.toM()) + "\n"); + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackDistance.plus(cumulativeDistance).toM()) + "\n"); } if (!trackPointExtensionContent.isEmpty()) { @@ -366,6 +373,10 @@ public class GPXTrackExporter implements TrackExporter { printWriter.println(""); } + if (cumulativeDistance != null) { + return cumulativeDistance; + } + return Distance.of(0); } private Double cumulateSensorData(TrackPoint trackPoint, List sensorPoints, Function map) {