Vertical accuracy: process and import/export.

Fixes #78.
This commit is contained in:
Dennis Guse
2022-05-03 07:39:37 +02:00
parent 0d3cf4ce0d
commit 094a20c379
14 changed files with 138 additions and 23 deletions
@@ -100,6 +100,7 @@ public class CSVTrackExporter implements TrackExporter {
new Column("longitude", t -> t.hasLocation() ? COORDINATE_FORMAT.format(t.getLatitude()) : ""),
new Column("altitude", t -> t.hasAltitude() ? COORDINATE_FORMAT.format(t.getAltitude().toM()) : ""),
new Column("accuracy_horizontal", t -> t.hasHorizontalAccuracy() ? DISTANCE_FORMAT.format(t.getHorizontalAccuracy().toM()) : ""),
new Column("accuracy_vertical", t -> t.hasVerticalAccuracy() ? DISTANCE_FORMAT.format(t.getVerticalAccuracy().toM()) : ""),
new Column("speed", t -> t.hasSpeed() ? SPEED_FORMAT.format(t.getSpeed().toKMH()) : ""),
new Column("altitude_gain", t -> t.hasAltitudeGain() ? DISTANCE_FORMAT.format(t.getAltitudeGain()) : ""),
@@ -361,6 +361,9 @@ public class GPXTrackExporter implements TrackExporter {
if (trackPoint.hasHorizontalAccuracy()) {
trackPointExtensionContent += ("<opentracks:accuracy_horizontal>" + DISTANCE_FORMAT.format(trackPoint.getHorizontalAccuracy().toM()) + "</opentracks:accuracy_horizontal>");
}
if (trackPoint.hasVerticalAccuracy()) {
trackPointExtensionContent += ("<opentracks:accuracy_vertical>" + DISTANCE_FORMAT.format(trackPoint.getVerticalAccuracy().toM()) + "</opentracks:accuracy_vertical>");
}
cumulativeDistance = Distance.ofOrNull(cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasSensorDistance() ? tp.getSensorDistance().toM() : null));
if (cumulativeDistance != null) {
@@ -66,6 +66,7 @@ public class KMLTrackExporter implements TrackExporter {
public static final String EXTENDED_DATA_TYPE_ALTITUDE_GAIN = "elevation_gain";
public static final String EXTENDED_DATA_TYPE_ALTITUDE_LOSS = "elevation_loss";
public static final String EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL = "accuracy_horizontal";
public static final String EXTENDED_DATA_TYPE_ACCURACY_VERTICAL = "accuracy_vertical";
private static final String MARKER_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
@@ -90,6 +91,7 @@ public class KMLTrackExporter implements TrackExporter {
private final List<Float> altitudeGainList = new ArrayList<>();
private final List<Float> altitudeLossList = new ArrayList<>();
private final List<Float> accuracyHorizontal = new ArrayList<>();
private final List<Float> accuracyVertical = new ArrayList<>();
public KMLTrackExporter(Context context, boolean exportPhotos) {
this.context = context;
@@ -336,6 +338,7 @@ public class KMLTrackExporter implements TrackExporter {
altitudeGainList.clear();
altitudeLossList.clear();
accuracyHorizontal.clear();
accuracyVertical.clear();
}
}
@@ -368,6 +371,9 @@ public class KMLTrackExporter implements TrackExporter {
if (accuracyHorizontal.stream().anyMatch(Objects::nonNull)) {
writeSimpleArrayData(accuracyHorizontal, EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL);
}
if (accuracyVertical.stream().anyMatch(Objects::nonNull)) {
writeSimpleArrayData(accuracyVertical, EXTENDED_DATA_TYPE_ACCURACY_VERTICAL);
}
printWriter.println("</SchemaData>");
printWriter.println("</ExtendedData>");
printWriter.println("</gx:Track>");
@@ -394,6 +400,7 @@ public class KMLTrackExporter implements TrackExporter {
altitudeGainList.add(trackPoint.hasAltitudeGain() ? trackPoint.getAltitudeGain() : null);
altitudeLossList.add(trackPoint.hasAltitudeLoss() ? trackPoint.getAltitudeLoss() : null);
accuracyHorizontal.add(trackPoint.hasHorizontalAccuracy() ? (float) trackPoint.getHorizontalAccuracy().toM() : null);
accuracyVertical.add(trackPoint.hasVerticalAccuracy() ? (float) trackPoint.getVerticalAccuracy().toM() : null);
}
}
@@ -83,7 +83,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac
private static final String TAG_EXTENSION_LOSS = "opentracks:loss";
private static final String TAG_EXTENSION_DISTANCE = "opentracks:distance";
private static final String TAG_EXTENSION_ACCURACY_HORIZONTAL = "opentracks:accuracy_horizontal";
private static final String TAG_EXTENSION_ACCURACY_VERTICAL = "opentracks:accuracy_vertical";
private Locator locator;
private final Context context;
@@ -114,6 +114,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac
private String loss;
private String sensorDistance;
private String accuracyHorizontal;
private String accuracyVertical;
private final LinkedList<TrackPoint> currentSegment = new LinkedList<>();
@@ -247,6 +248,11 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac
accuracyHorizontal = content.trim();
}
break;
case TAG_EXTENSION_ACCURACY_VERTICAL:
if (content != null) {
accuracyVertical = content.trim();
}
break;
}
content = "";
@@ -356,6 +362,13 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac
throw new ParsingException(createErrorMessage(String.format(Locale.US, "Unable to parse accuracy_horizontal: %s", sensorDistance)), e);
}
}
if (accuracyVertical != null) {
try {
trackPoint.setVerticalAccuracy(Distance.of(accuracyVertical));
} catch (NumberFormatException e) {
throw new ParsingException(createErrorMessage(String.format(Locale.US, "Unable to parse accuracy_vertical: %s", sensorDistance)), e);
}
}
return trackPoint;
}
@@ -372,6 +385,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac
sensorDistance = null;
accuracyHorizontal = null;
accuracyVertical = null;
power = null;
heartrate = null;
cadence = null;
@@ -90,6 +90,7 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac
private final ArrayList<Float> altitudeGainList = new ArrayList<>();
private final ArrayList<Float> altitudeLossList = new ArrayList<>();
private final ArrayList<Float> accuracyHorizontal = new ArrayList<>();
private final ArrayList<Float> accuracyVertical = new ArrayList<>();
private final ArrayList<Marker> markers = new ArrayList<>();
@@ -296,6 +297,7 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac
altitudeGainList.clear();
altitudeLossList.clear();
accuracyHorizontal.clear();
accuracyVertical.clear();
}
private void onTrackSegmentEnd() {
@@ -338,6 +340,9 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac
if (i < accuracyHorizontal.size() && accuracyHorizontal.get(i) != null) {
trackPoint.setHorizontalAccuracy(Distance.of(accuracyHorizontal.get(i)));
}
if (i < accuracyVertical.size() && accuracyVertical.get(i) != null) {
trackPoint.setVerticalAccuracy(Distance.of(accuracyVertical.get(i)));
}
// Update TrackPoint type for START / STOP.
TrackPoint.Type type = trackPoint.getType();
@@ -438,6 +443,9 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac
case KMLTrackExporter.EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL:
accuracyHorizontal.add(value);
break;
case KMLTrackExporter.EXTENDED_DATA_TYPE_ACCURACY_VERTICAL:
accuracyVertical.add(value);
break;
default:
Log.w(TAG, "Data from extended data " + extendedDataType + " is not (yet) supported.");
}