在 iOS、watchOS 和 macOS 上轻松解析和生成 GPX 文件。
什么是 CoreGPX?
CoreGPX 是将 iOS-GPX-Framework 章程移植到 Swift 语言。
CoreGPX 目前支持 GPX v1.1 架构中列出的所有 GPX 标签。它可以在 iOS、macOS 和 watchOS 上生成和解析符合 GPX v1.1 的文件。
因为它使用 XMLParser
来解析 GPX 文件,所以 CoreGPX 完全依赖于 Foundation
API。
功能
- 成功输出可打包到 GPX 文件的字符串
- 使用原生 XMLParser 解析 GPX 文件
- 支持 iOS、macOS 和 watchOS
- (新) 在基本类中支持
Codable
- (新) 增强
GPXExtensions
的全面支持,包括解析和创建 - (新) 输出无损 GPX 压缩。查看 GPXCompressor 了解此新特性的实现。
文档
CoreGPX 使用 jazzy 进行文档编写。
您可以在这里阅读文档,它记录了用于解析和创建 GPX 文件的大多数重要功能。
CoreGPX 支持CocoaPods、Carthage以及Swift Package Manager,因此您可以按任何方式安装它。
要使用CocoaPods进行安装,只需将以下行添加到您的Podfile中
pod 'CoreGPX'
CoreGPX 也可以与Carthage一起工作,只需将以下行添加到您的Cartfile中
github "vincentneo/CoreGPX"
通过初始化GPXParser
来解析GPX文件。
初始化GPXParser
有五种方式,以下是其中的三种主要方式
guard let gpx = GPXParser(withURL: inputURL)?.parsedData() else { return }
guard let gpx = GPXParser(withPath: inputPath)?.parsedData() else { return } // String type
let gpx = GPXParser(withData: inputData).parsedData()
.parsedData()
返回一个GPXRoot
类型,其中包含所有元数据、轨迹点、路径、路线和扩展(如果有),取决于该文件的内容,您可以从GPX文件中期望得到所有这些内容。
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 longitude, 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
如何创建?
您将从 GPXRoot
开始。
GPXRoot
初始化 let root = GPXRoot(creator: "Your app name here!") // insert your app name here
现在,您可以开始向您的 GPXRoot
添加内容。这包括元数据、航标点、轨迹、路线以及(如果有的话)扩展。
GPXRoot
将航标点添加到 root.add(waypoints: arrayOfWaypoints) // adds an array of waypoints
root.add(waypoint: singleWaypoint) // adds a single waypoint
GPXRoot
将轨迹添加到 root.add(tracks: arrayOfTracks) // adds an array of tracks
root.add(track: singleTrack) // adds a single track
GPXRoot
将路线添加到 root.add(routes: arrayOfRoutes) // adds an array of routes
root.add(route: singleRoute) // adds a single route
GPXRoot
将元数据添加到 let metadata = GPXMetadata()
metadata.name = "Your Name Here"
metadata.desc = "Description of your GPX file"
root.metadata = metadata // adds metadata stuff
GPXRoot
应用示例
let root = GPXRoot(creator: "Your app name here!")
var 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
trackpoints.append(trackpoint)
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
这将是上述示例中从 root.gpx()
获取的内容
<?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!">
<trk>
<trkseg>
<trkpt lat="1.352100" lon="103.819800">
<ele>10.724</ele>
<time>2019-02-12T05:38:19Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
GPXRoot
的.gpx()
输出一个String
,然后可以打包成 .GPX 文件。.OutputToFile(saveAt:fileName:)
将 GPX 内容直接保存到指定的 URL。
处理扩展
在 CoreGPX 中,GPX 文件中的扩展表示为 GPXExtensions
。
访问 GPX 文件的扩展
一旦解析了 GPX 文件,您可以使用下标,通过标签名来访问扩展。
- 使用
extensions["tagNameHere"]
获取一个包含解析数据的GPXExtensionElement
。或者,使用get(from parent: String?)
获取一个包含解析扩展数据的字典。
编写 GPX 扩展
- 首先,使用
init(withExtensionAttributes:, schemaLocation:)
初始化 GPXRoot,以便在主 GPX 标头标签上初始化扩展模式信息。 - 其次,在需要时初始化 GPXExtensions,以便在必要时添加到 GPXRoot 或其他元素中。
- 使用函数
append(at parent: String?, contents: [String : String])
编写扩展数据。如果没有父元素,请使用nil
。
要了解更多信息,请阅读有关 GPXExtensions
和 GPXExtensionsElement
的文档。
示例
要深入了解 CoreGPX 可以提供的内容,请查看示例应用程序。要运行示例项目,只需克隆存储库,然后立即尝试它!
贡献
对本项目的贡献将非常欢迎。请随意提交一个拉取请求或开放一个问题。如果您需要一个尚未提供的特性,请提交一个问题,描述为什么需要该特性、它能带来什么以及如何帮助您!
喜欢本项目吗?看看这些吧!
- iOS-Open-GPX-Tracker,一个出色的开源iOS和watchOS GPS追踪器。
- Avenue GPX Viewer,一个适用于macOS 10.12及以上版本的GPX文件查看器。
- LocaleComplete,一个简化
Locale
标识符查找的小型库。
许可协议
CoreGPX 以MIT许可协议发布。更多信息请参阅LICENSE文件。