Создание файла GPX из массива CLLocation
мое приложение должно совместно использовать массив CLLocations (Route) в устройствах, использующих приложение.У меня нет опыта использования GPX до этого. Является ли GPX лучшим форматом для этого? Как я могу создать файл GPX с учетом такой массив объектов cllocation? и есть ли стандартный парсер GPX в Objective C? Из того, что я искал в сети, и поэтому ответ на эти вопросы соответственно
1.cant say
2. I have seen some webpages converting data of points in GPX format but could not find how they are doing it.
3. No
Я буду рад, если я получу альтернативные ответы / представления. Я понимаю, что это много вопросы. Любая помощь или предложение будут очень оценены.
5 ответов
Ватанабэ Тосинори только что стал вашим новым лучшим другом (и моим), код здесь:
http://github.com/FLCLjp/iOS-GPX-Framework
чтобы ответить на ваши конкретные вопросы:
да, GPX-очень хороший формат для обмена данными о местоположении. Для этого он и нужен.
У меня нет кода для этого, но вам придется перебрать массив объектов cllocation и построить структуру данных XML, как вы идете. Используйте один синтаксический анализатор xml, который поддерживает запись. (См. ссылку ниже).
в Objective C нет стандартного парсера GPX, но GPX - это просто xml таким образом, вы можете использовать любой синтаксический анализатор xml, который работает под iOS или OSX. Рэй Вендерлих имеет очень хороший учебник по использованию xml под iOS что объясняет, как выбрать правильный парсер для ваших нужд. Это не специфично для GPX, но опять же GPX - это просто вкус xml; принципы те же.
образец GPX:
<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(формат обмена GPS) заканчивается на .GPX файл расширение
все, что вам нужно сделать, это просто повторить массив CLLocations и создать теги(wpx) и сохранить файл как .GPX файл
надеюсь, это поможет
вот он в swift 4 на всякий случай, если кому-то это нужно с UIAlert, чтобы ввести имя файла
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 = ""
}
}