SwiftGpx 1.0.1

SwiftGpx 1.0.1

Axel Ancona Esselmann 维护。



SwiftGpx 1.0.1

  • anconaesselmann

SwiftGpx

CI Status Version License Platform

SwiftGpx 是一个解析和写入 GPX 数据的库。

示例

要运行示例播放地,请克隆仓库,在 Example 目录下运行 pod install,然后打开 Example.xcworkspace 工作空间。 Example 播放地(项目导航器中的第一个元素)包含以下所有示例。

导入 SwiftGpx

import SwiftGpx

以下一些示例需要您导入

import CoreLocation

实例化 GPX 对象...

使用 CLLocation 实例的 Array

let locations: [CLLocation] = [
    CLLocation(lat: 38.1237270, lon: -119.4670500, alt: 2899.8, dateString: "2021-06-03T20:25:26Z"),
    CLLocation(lat: 38.1237330, lon: -119.4670490, alt: 2899.8, dateString: "2021-06-03T20:25:27Z"),
    CLLocation(lat: 38.1237360, lon: -119.4670510, alt: 2899.8, dateString: "2021-06-03T20:25:28Z"),
    CLLocation(lat: 38.1237360, lon: -119.4670500, alt: 2899.8, dateString: "2021-06-03T20:25:29Z"),
    CLLocation(lat: 38.1237360, lon: -119.4670500, alt: 2899.8, dateString: "2021-06-03T20:25:30Z"),
    CLLocation(lat: 38.1237360, lon: -119.4670510, alt: 2899.8, dateString: "2021-06-03T20:25:31Z")
].compactMap { $0 }

let gpx = GPX(name: "My Track", locations: locations)

使用 GPX 文件的 xml 内容

let gpxString = """
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx
    xmlns="http://www.topografix.com/GPX/1/1" creator="SwiftGpx by Axel Ancona Esselmann" version="1.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
    <trk>
        <name>My Track</name>
        <trkseg>
            <trkpt lat="38.123727" lon="-119.46705">
                <ele>2899.8</ele>
                <time>2021-06-03T20:25:26Z</time>
            </trkpt>
            <trkpt lat="38.123733" lon="-119.467049">
                <ele>2899.8</ele>
                <time>2021-06-03T20:25:27Z</time>
            </trkpt>
        </trkseg>
        <trkseg>
            <trkpt lat="38.123736" lon="-119.467051">
                <ele>2899.8</ele>
                <time>2021-06-03T20:25:28Z</time>
            </trkpt>
            <trkpt lat="38.123736" lon="-119.46705">
                <ele>2899.8</ele>
                <time>2021-06-03T20:25:29Z</time>
            </trkpt>
        </trkseg>
    </trk>
</gpx>
"""

let gpx = GPX(xmlString: gpxString)

使用位于 Bundle 中的文件的名称

let gpx = GPX(fileName: "example", fileExtension: "gpx")

使用本地的文件资源

if let localResource = Bundle.main.url(forResource: "example", withExtension: "gpx") {
    let gpx = GPX(localResource: localResource)
    ...
}

GPX 内容转换为...

转换为 GPX String

let gpx = GPX(name: "My Track", locations: locations)
let xmlString = gpx.xmlString

转换为 Data,它可以编码为存储或传输为 GPX 文件

let gpx = GPX(name: "My Track", locations: locations)
let xmlData = gpx.data

使用Codabl进行序列化和反序列化

以下JSONEncoder的设置将生成如下输出的结果

{
  "name" : "My Track",
  "track_segments" : [
    [
      {
        "lat" : 38.123727000000002,
        "lon" : -119.46705,
        "ele" : 2899.8000000000002,
        "date" : "2021-06-03T20:25:26Z"
      },
      {
        "lat" : 38.123733000000001,
        "lon" : -119.467049,
        "ele" : 2899.8000000000002,
        "date" : "2021-06-03T20:25:27Z"
      }
    ],
    [
      {
        "lat" : 38.123736000000001,
        "lon" : -119.46705,
        "ele" : 2899.8000000000002,
        "date" : "2021-06-03T20:25:29Z"
      },
      {
        "lat" : 38.123736000000001,
        "lon" : -119.46705,
        "ele" : 2899.8000000000002,
        "date" : "2021-06-03T20:25:30Z"
      }
    ]
  ]
}

使用JSONEncoder进行编码

let gpx = GPX(name: "My Track", locations: locations)

let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.outputFormatting = [.prettyPrinted]
let encoded = try encoder.encode(gpx)
let encodedString = String(data: encoded, encoding: .utf8)

使用JSONDecoder进行解码

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
decoder.keyDecodingStrategy = .convertFromSnakeCase
// uses the encoded data from the previous example
let gpxFromJson = try decoder.decode(GPX.self, from: encoded) 

将数据序列化成一个保持XML结构的字典

gpxJson属性将产生一个可以序列化成如下格式的字典

{
    "gpx": {
        "name": "My Track",
        "trkseg_elements": [
            [
                {
                    "lon": -119.46705,
                    "lat": 38.123727000000002,
                    "ele": 2899.8000000000002,
                    "time": "2021-06-03T13:25:26-0700"
                },
                {
                    "time": "2021-06-03T13:25:27-0700",
                    "lon": -119.467049,
                    "lat": 38.123733000000001,
                    "ele": 2899.8000000000002
                }
            ]
        ]
    }
}
let gpx = GPX(name: "My Track", locations: locations)
let dictionary: [String: Any] = gpx.gpxJson

您可以使用以下方法获取JSON字符串

let gpx = GPX(name: "My Track", locations: locations)
let data = try JSONSerialization.data(withJSONObject: gpx.gpxJson, options: [.prettyPrinted])
let jsonString = String(data: data, encoding: .utf8)

安装

SwiftGpx可以通过CocoaPods获取。要安装,请简单地将以下行添加到您的Podfile中

pod 'SwiftGpx'

作者

anconaesselmann, [email protected]

许可证

SwiftGpx可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。