Swiftpack.co - Package - vincentneo/CoreGPX

Parse and generate GPX files easily on iOS, watchOS & macOS.

CI Status Swift Version GPX Version License Platform Version Carthage compatible Swift Package Manager compatible

What is CoreGPX?

CoreGPX is a port of iOS-GPX-Framework to Swift language.

CoreGPX currently supports all GPX tags listed in GPX v1.1 schema. It can generate and parse GPX v1.1 compliant files on iOS, macOS and watchOS.

As it makes use of XMLParser for parsing GPX files, CoreGPX is fully dependent on the Foundation API only.


  • [x] Successfully outputs string that can be packaged into a GPX file
  • [x] Parses GPX files using native XMLParser
  • [x] Support for iOS, macOS & watchOS
  • [x] (new) Supports Codable in essential classes


CoreGPX is documented using jazzy.

Documentation Status

You can read the documentation here, which documents most of the important features that will be used for parsing and creating of GPX files.


CoreGPX supports CocoaPods, Carthage, as well as Swift Package Manager, such that you can install it, any way you want.

To install using CocoaPods, simply add the following line to your Podfile:

pod 'CoreGPX'

CoreGPX works with Carthage as well, simply add the following line to your Cartfile:

github "vincentneo/CoreGPX"

How to parse?

Parsing of GPX files is done by initializing GPXParser.

There are five ways of initializing GPXParser, and these are three main ways of initializing:

You can initialize with a URL:

guard let gpx = GPXParser(withURL: inputURL)?.parsedData() else { return }

With path:

guard let gpx = GPXParser(withPath: inputPath)?.parsedData() else { return } // String type

With Data:

let gpx = GPXParser(withData: inputData).parsedData()

.parsedData() returns a GPXRoot type, which contains all the metadata, waypoints, tracks, routes, and extensions(if any), which you can expect from a GPX file, depending on what that file contains.

Making use of parsed GPX data

guard let gpx = GPXParser(withURL: inputURL)?.parsedData() else { return // do things here when failed }
// waypoints, tracks, tracksegements, trackpoints are all stored as Array depends on the amount stored in the GPX file.
for waypoint in gpx.waypoints {  // for loop example, every waypoint is written
    print(waypoint.latitude)     // prints every waypoint's latitude, etc: 1.3521, as a Double object
    print(waypoint.longitude)    // prints every waypoint's latitude, etc: 103.8198, as a Double object
    print(waypoint.time)         // prints every waypoint's date, as a Date object
    print(waypoint.name)         // prints every waypoint's name, as a String
    print(gpx.metadata?.desc)    // prints description given in GPX file metadata tag
    print(gpx.metadata?.name)    // prints name given in GPX file metadata tag

How to create?

You will first start off with a GPXRoot.

Initializing GPXRoot

let root = GPXRoot(creator: "Your app name here!") // insert your app name here

Now, you can start adding things to your GPXRoot. This includes your metadata, waypoints, tracks, routes, as well as extensions(if any).

Adding waypoints to GPXRoot

root.add(waypoints: arrayOfWaypoints) // adds an array of waypoints
root.add(waypoint: singleWaypoint)    // adds a single waypoint

Adding tracks to GPXRoot

root.add(tracks: arrayOfTracks)       // adds an array of tracks
root.add(track: singleTrack)          // adds a single track

Adding routes to GPXRoot

root.add(routes: arrayOfRoutes)       // adds an array of routes
root.add(route: singleRoute)          // adds a single route

Adding metadata to GPXRoot

let metadata = GPXMetadata()
metadata.name = "Your Name Here"
metadata.desc = "Description of your GPX file"
root.metadata = metadata              // adds metadata stuff

Example of application of GPXRoot

let root = GPXRoot(creator: "Your app name here!")
let trackpoints = [GPXTrackPoint]()

let yourLatitudeHere: CLLocationDegrees = 1.3521
let yourLongitudeHere: CLLocationDegrees = 103.8198
let yourElevationValue: Double = 10.724

let trackpoint = GPXTrackPoint(latitude: yourLatitudeHere, longitude: yourLongitudeHere)
trackpoint.elevation = yourElevationValue
trackpoint.time = Date() // set time to current date

let track = GPXTrack()                          // inits a track
let tracksegment = GPXTrackSegment()            // inits a tracksegment
tracksegment.add(trackpoints: trackpoints)      // adds an array of trackpoints to a track segment
track.add(trackSegment: tracksegment)           // adds a track segment to a track
root.add(track: track)                          // adds a track

print(root.gpx())				// prints the GPX formatted string

This would be what you get from root.gpx() in the above example:

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="Your app name here!">
			<trkpt lat="1.352100" lon="103.819800">
  • .gpx() of GPXRoot outputs a String which can then be packaged as a .GPX file.
  • .OutputToFile(saveAt:fileName:) directly saves GPX contents to a URL specified.


To know in depth of what CoreGPX can bring, do check out the Example app. To run the example project, simply clone the repo, and try it out straight away!


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!


CoreGPX is available under the MIT license. See the LICENSE file for more info.


Stars: 9
Help us keep the lights on


Used By

Total: 0


0.5.5 - May 12, 2019

Basic Codable support have been implemented for some classes, including:

  • GPXExtensions
  • GPXLink
  • GPXRoute
  • GPXWaypoint
  • GPXTrack
  • GPXTrackSegment
  • GPXTrackPoint
  • GPXWaypoint

Serialization for the following types should now be made easy!

0.5.1 - Mar 26, 2019

Minor update. The parser will now parse the GPX file's version and creator as well.

0.5.0 - Mar 24, 2019

This update contains the following:

  • #26 Add support for swift package manager installation
  • #29 Fully documented features in CoreGPX
  • Deprecate certain methods
  • Moved Date parsers out of GPXWaypoint for decluttering
  • Moved number converters out for decluttering
  • New way of initialising GPXLink
  • New way of initialising GPXEmail, for a more user friendly approach
  • Privatised most of GPXParser's internally used objects

0.4.4 - Feb 27, 2019

This update includes:

  • a bug fix where href of GPXLink will produce null every time when generating a GPX file.

Special thanks to @jdleung for spotting and informing regards to this bug!

0.4.3 - Feb 20, 2019

While this update isn't all that big, it still includes these features:

  • Added Tests
  • Added a direct way of saving a GPX file from GPXRoot
  • Fixed missing Xcode example project in workspace
  • Removal of CGFloat related methods in GPXType (Apple Watch doesn't support CGFloat and the whole project uses Double now anyways)