Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.

Commit f5a066b

Browse files
committed
serialize TrackPoint elevation & time
1 parent 435de9e commit f5a066b

4 files changed

Lines changed: 50 additions & 6 deletions

File tree

src/main/kotlin/be/yellowduck/gpx/GPX.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class GPX {
8282
gpx.tracks.add(track)
8383
}
8484

85-
} catch (e: SAXParseException) {
85+
} catch (_: SAXParseException) {
8686
throw GPXDocumentException()
8787
}
8888

@@ -91,8 +91,8 @@ class GPX {
9191
}
9292

9393
private fun parseName(doc: org.w3c.dom.Document): String {
94-
return doc.getElementsByTagName("metadata").items().firstOrNull()?.let { metadata ->
95-
metadata.childNodes.itemsByName("name").firstOrNull()?.textContent
94+
return doc.getElementsByTagName("metadata").items().firstOrNull()?.let { metadata ->
95+
metadata.childNodes.itemsByName("name").firstOrNull()?.textContent
9696
} ?: ""
9797
}
9898

@@ -140,9 +140,9 @@ class GPX {
140140
}
141141

142142
private fun parseTrackPoint(node: Node): TrackPoint {
143-
144-
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
145-
val parsedDate = node.firstChildByName("time")?.textContent?.let { LocalDateTime.parse( it, formatter) }
143+
val parsedDate = node.firstChildByName("time")?.textContent?.let {
144+
LocalDateTime.parse(it, DateTimeFormatter.ISO_DATE_TIME)
145+
}
146146

147147
return TrackPoint(
148148
lat = node.doubleAttribute("lat"),

src/main/kotlin/be/yellowduck/gpx/GPXWriter.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package be.yellowduck.gpx
33
import com.sun.xml.txw2.output.IndentingXMLStreamWriter
44
import java.io.ByteArrayOutputStream
55
import java.io.OutputStream
6+
import java.time.temporal.ChronoUnit
67
import javax.xml.stream.XMLOutputFactory
78

89
class GPXWriter : IWriter {
@@ -53,6 +54,14 @@ class GPXWriter : IWriter {
5354
element("trkpt") {
5455
attribute("lat", point.lat.toString())
5556
attribute("lon", point.lon.toString())
57+
58+
if (point.ele != 0.0) {
59+
element("ele", point.ele.toString())
60+
}
61+
62+
point.time?.let { time ->
63+
element("time", time.truncatedTo(ChronoUnit.SECONDS).toString())
64+
}
5665
}
5766
}
5867
}

src/main/kotlin/be/yellowduck/gpx/TCXWriter.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ class TCXWriter : IWriter {
5454
element("LatitudeDegrees", point.lat.toString())
5555
element("LongitudeDegrees", point.lon.toString())
5656
}
57+
58+
if (point.ele != 0.0) {
59+
element("AltitudeMeters", point.ele.toString())
60+
}
61+
62+
point.time?.let { time ->
63+
element("Time", point.time.toString())
64+
}
65+
5766
val distance: Double = previousPoint?.distanceTo(point)?.meters ?: 0.0
5867
element("DistanceMeters", distance.toString())
5968
previousPoint = point

src/test/kotlin/be/yellowduck/gpx/TrackPointTests.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,30 @@ class TrackPointTests {
5353

5454
}
5555

56+
@Test
57+
fun trackPointSerialize() {
58+
val point = TrackPoint()
59+
point.lat = 48.1969
60+
point.lon = 16.34528
61+
point.ele = 2.6
62+
point.time = now
63+
64+
val gpx = GPX.parse(
65+
GPXFile(
66+
tracks = mutableListOf(
67+
Track(
68+
segments = mutableListOf(
69+
Segment(
70+
points = mutableListOf(point)
71+
)
72+
)
73+
)
74+
)
75+
).toString().toByteArray().inputStream()
76+
)
77+
78+
assertThat(gpx.tracks.firstOrNull()?.segments?.firstOrNull()?.points?.first()).isEqualTo(point)
79+
}
80+
81+
5682
}

0 commit comments

Comments
 (0)