A library for parsing and exporting GPX files with no dependencies besides Foundation.
- Parsing GPX files into a track struct
- Exporting a track to a GPX xml
- Support for iOS, macOS & watchOS
- Optionally removes date and time from exported GPX for keeping privacy
- Combine support
- Height Map, geo-bounds, distance, and elevation information for an imported track
- Waypoint support
- Test coverage
- Climb detection
- Grade segmentation
- Support for Garmin trackpoint extensions
- Support for multiple track segements
To use the GPXKit
library in a SwiftPM project, add the following line to the dependencies in your Package.swift
file:
.package(url: "https://github.com/mmllr/GPXKit", from: "2.3.0")
import GPXKit
let parser = GPXFileParser(xmlString: xml)
switch parser.parse() {
case .success(let track):
doSomethingWith(track)
case .failure(let error):
parseError = error
}
...
func doSomethingWith(_ track: GPXTrack) {
let formatter = MeasurementFormatter()
formatter.unitStyle = .short
formatter.unitOptions = .naturalScale
formatter.numberFormatter.maximumFractionDigits = 1
let trackGraph = track.graph
print("Track length: \(formatter.string(from: Measurement<UnitLength>(value: trackGraph.distance, unit: .meters)))")
print("Track elevation: \(formatter.string(from: Measurement<UnitLength>(value: trackGraph.elevationGain, unit: .meters)))")
for point in track.trackPoints {
print("Lat: \(point.coordinate.latitude), lon: \(point.coordinate.longitude)")
}
}
import GPXKit
let track: GPXTrack = ...
let exporter = GPXExporter(track: track, shouldExportDate: false)
print(exporter.xmlString)
import Combine
import GPXKit
let url = /// url with gpx
GPXFileParser.load(from: url)
.publisher
.map { track in
// do something with parsed track
}
See tests for more usage examples.
To detect climbs in a track, use the TrackGraph
s climb(epsilon:minimumGrade:maxJoinDistance:)
method which returns an array of Climb
values for given filter parameters.
let track: GPXTrack = ...
let climbs = track.graph.climbs(epsilon: 4.0, minimumGrade: 3.0, maxJoinDistance: 0.0)
// climbs is an array of `Climb` values, describing each climb (start, end, elevation, grade, FIETS score and so on...).
Project documentation is available at Swift Package Index
Contributions to this project will be more than welcomed. Feel free to add a pull request or open an issue. If you require a feature that has yet to be available, do open an issue, describing why and what the feature could bring and how it would help you!