Import: re-implement KML parsing.

Fixes #790.
This commit is contained in:
Dennis Guse
2021-05-25 18:40:52 +02:00
parent 68c8839ebb
commit 54e8fd3ee3
9 changed files with 540 additions and 111 deletions
@@ -44,7 +44,7 @@ public final class Marker {
private String description = "";
private String category = "";
private String icon = "";
private final Track.Id trackId;
private Track.Id trackId;
private final Instant time;
private Double latitude;
@@ -74,16 +74,13 @@ public final class Marker {
if (!trackPoint.hasLocation())
throw new RuntimeException("Marker requires a trackpoint with a location.");
this.latitude = trackPoint.getLatitude();
this.longitude = trackPoint.getLongitude();
if (trackPoint.hasAccuracy()) this.accuracy = trackPoint.getAccuracy();
if (trackPoint.hasAltitude()) this.altitude = trackPoint.getAltitude();
if (trackPoint.hasBearing()) this.bearing = trackPoint.getBearing();
setTrackPoint(trackPoint);
this.length = Distance.of(0); //TODO Not cool!
this.duration = Duration.ofMillis(0); //TODO Not cool!
}
@Deprecated
public Marker(String name, String description, String category, String icon, @NonNull Track.Id trackId, @NonNull TrackStatistics statistics, @NonNull TrackPoint trackPoint, String photoUrl) {
this(trackId, trackPoint);
this.name = name;
@@ -95,6 +92,15 @@ public final class Marker {
this.photoUrl = photoUrl;
}
//TODO Is somehow part of the initialization process. Can we at least limit visibility?
public void setTrackPoint(TrackPoint trackPoint) {
this.latitude = trackPoint.getLatitude();
this.longitude = trackPoint.getLongitude();
if (trackPoint.hasAccuracy()) this.accuracy = trackPoint.getAccuracy();
if (trackPoint.hasAltitude()) this.altitude = trackPoint.getAltitude();
if (trackPoint.hasBearing()) this.bearing = trackPoint.getBearing();
}
/**
* May be null if the it was not loaded from the database.
*/
@@ -143,16 +149,19 @@ public final class Marker {
this.icon = icon;
}
@NonNull
public Track.Id getTrackId() {
return trackId;
}
@Deprecated
public void setTrackId(@NonNull Track.Id trackId) {
this.trackId = trackId;
}
public boolean hasLocation() {
return latitude != null || longitude != null;
}
@Nullable
public Location getLocation() {
Location location = new Location("");
location.setTime(time.toEpochMilli());
@@ -33,6 +33,7 @@ import de.dennisguse.opentracks.stats.TrackStatistics;
* @author Leif Hendrik Wilden
* @author Rodrigo Damazio
*/
//TODO Do not default initialize attributes; might be confusing for debugging
public class Track {
private Track.Id id;
@@ -55,7 +55,7 @@ public class TrackPoint {
private Altitude altitude;
private Speed speed;
private Float bearing;
private Distance sensorDistance_m;
private Distance sensorDistance;
public enum Type {
SEGMENT_START_MANUAL(-2), //Start of a segment due to user interaction (start, resume)
@@ -99,7 +99,11 @@ public class TrackPoint {
}
public TrackPoint(@NonNull Location location) {
this(Type.TRACKPOINT);
this(Type.TRACKPOINT, location, Instant.now());
}
public TrackPoint(@NonNull Type type, @NonNull Location location, @NonNull Instant time) {
this(type);
this.latitude = location.getLatitude();
this.longitude = location.getLongitude();
@@ -107,7 +111,9 @@ public class TrackPoint {
this.speed = Speed.of(location.getSpeed());
this.accuracy = location.getAccuracy();
setTime(Instant.now());
//TODO Should we copy the bearing?
setTime(time);
}
public TrackPoint(@NonNull Type type, Instant time) {
@@ -314,10 +320,14 @@ public class TrackPoint {
this.accuracy = horizontalAccuracy;
}
@Nullable
public Distance distanceToPrevious(@NonNull TrackPoint previous) {
if (hasSensorDistance()) {
return getSensorDistance();
}
if (!(hasLocation() && previous.hasLocation())) {
return null;
}
return Distance.of(getLocation().distanceTo(previous.getLocation()));
}
@@ -336,15 +346,15 @@ public class TrackPoint {
// Sensor data
public boolean hasSensorDistance() {
return sensorDistance_m != null;
return sensorDistance != null;
}
public Distance getSensorDistance() {
return sensorDistance_m;
return sensorDistance;
}
public void setSensorDistance(Distance distance_m) {
this.sensorDistance_m = distance_m;
this.sensorDistance = distance_m;
}
public boolean hasSensorData() {