从CLLocation数组创建GPX文件

9
我的应用程序需要使用GPX格式共享CLLocations(路线)数组在设备之间。我以前没有使用过GPX。GPX是最好的格式吗?如何从给定的CLLocations数组创建GPX文件?是否有Objective C中的标准GPX解析器?
根据我在网上搜索和SO的答案,分别是:
  1. 无法确定
  2. 我看到一些网页将点数据转换为GPX格式,但找不到它们是如何做到的。
  3. 没有
如果能得到替代答案/观点,我会很高兴。我知道这是很多问题。任何帮助或建议都将受到极大的赞赏。

我不认为你的应用程序会读取GPX文件,更多是模拟器本身将位置信息提供给应用程序。在Xcode中有一个位置箭头,您可以单击它来加载您的GPX文件。还有一些默认位置,您也可以查看。 - Bill Burgess
5个回答

7

答案中的第一个链接似乎已经过时了。 - Pang
1
是的。 这个github项目也已被长时间放弃,但fork网络显示出许多有前途的分支供我们研究。 特别是:https://github.com/webventil/iOS-GPX-Framework和https://github.com/kimar/iOS-GPX-Framework。 - Aleksandar Vacić

5

如果有人需要使用UIAlert输入文件名,这里提供了Swift 4的代码:

    func handleCancel(alertView: UIAlertAction!)
    {
        print("Cancelled !!")
    }

    let alert = UIAlertController(title: "Export GPX", message: "Enter a name for the file", preferredStyle: .alert)

    alert.addTextField { (textField) in
        textField.text = ""
    }
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:handleCancel))
    alert.addAction(UIAlertAction(title: "Done", style: .default, handler:{ (UIAlertAction) in
        if alert.textFields?[0].text != nil {
            let fileName = "\(String(describing: alert.textFields![0].text!)).GPX"
            let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
            var gpxText : String = String("<?xml version=\"1.0\" encoding=\"UTF-8\"?><gpx version=\"1.1\" creator=\"yourAppNameHere\" xmlns=\"http://www.topografix.com/GPX/1/1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:gte=\"http://www.gpstrackeditor.com/xmlschemas/General/1\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">")
            gpxText.append("<trk><trkseg>")
            for locations in self.locationsArray{
                let newLine : String = String("<trkpt lat=\"\(String(format:"%.6f", locations.locLatitude))\" lon=\"\(String(format:"%.6f", locations.locLongitude))\"><ele>\(locations.locAltitude)</ele><time>\(String(describing: locations.locTimestamp!))</time></trkpt>")
            gpxText.append(contentsOf: newLine)
            }
            gpxText.append("</trkseg></trk></gpx>")
            do {
                try gpxText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)

                let vc = UIActivityViewController(activityItems: [path!], applicationActivities: [])

                self.present(vc, animated: true, completion: nil)

            } catch {

                print("Failed to create file")
                print("\(error)")
            }

        } else {
            print("There is no data to export")

        }


    }))
    self.present(alert, animated: true, completion: {
        print("completion block")
    })
}


func textFieldHandler(textField: UITextField!)
{
      if (textField) != nil {
    textField.text = ""
  }
}

3
回答你的具体问题:
  1. 是的,GPX是非常好的用于共享位置数据的格式。这就是它的作用。

  2. 我没有代码来完成此操作,但您需要遍历CLLocations数组并在进行操作时构建xml数据结构。使用支持写入的xml解析器之一(请参见下面的链接)。

  3. Objective C中没有标准的GPX解析器,但GPX只是xml,因此您可以使用任何适用于iOS或OSX的xml解析器。Ray Wenderlich有一个非常好的教程,介绍了如何在iOS下选择合适的解析器(链接)。虽然这不是针对GPX的,但GPX只是xml的一种形式;原则都是相同的。


非常感谢。那很有帮助。还有一个小问题,你用过GeoJSON吗?它与GPX相比性能如何? - chatur
2
性能是完全不同的问题。除非你的文件太大而导致性能问题,否则我建议使用普通的 GPX。请注意,GPX 支持 GPS 的轨迹(Tracks)、路线(Routes)和途经点(Waypoints)等概念,但 GeoJSON 更类似于 GIS,使用点、线、面等数据结构。你可以使用任何格式,但如果你要表示路线,则 GPX 可能更适合你的应用程序。 - Dave Robertson
1
更新:现在有一个用于解析iOS下GPX文件的开源库,iOS GPX Framework。源代码可以在Watanabe Toshinori的github网站上找到,该网站还提供了一个KML库和示例应用程序,展示了如何使用这些库。 - Dave Robertson
1
如何将用户的实时位置经纬度写入GPX文件?我的目标是想与另一个用户共享用户行驶的路径。 - user1374

3

GPX Sample:

<gpx xmlns="http://www.topografix.com/GPX/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"
    version="1.1"
    creator="YourCompanyName">

     <wpt lat="Your latitude" lon="Your longitude">

       <time>Your Time</time>

       <name>Your Location name.</name>

    </wpt>

</gpx>
.gpx扩展名结尾。

您只需迭代CLLocations数组并创建标签(wpx),然后将文件另存为.gpx即可。

我希望这可以帮助到您。


如何将运行时用户位置经纬度写入GPX文件 - user1374
有许多第三方库可以做到这一点,您也可以通过字符串构建自己实现。 - Durai Amuthan.H

-2
在 Xcode 5 中,添加新文件 -> 资源 -> GPX 文件。

1
OP正在询问如何从内存中的CLLocation点列表创建自定义GPX文件,而不是在Xcode中手动创建GPX文件。 - worthbak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接