2012-01-03 7 views
8

Mi aplicación necesita compartir una matriz de CLLocations (Ruta) dentro de los dispositivos mediante la aplicación. No tengo experiencia en usar GPX antes de esto. ¿GPX es el mejor formato para hacerlo? ¿Cómo puedo crear un archivo GPX desde dicha matriz de CLLocations? y hay un analizador GPX estándar en Objective C? Por lo que he buscado en la red y SO responder a estas preguntas son, respectivamente,Creación de archivos GPX desde una matriz de CLLocation

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 

seré feliz si consigo alternos respuestas/puntos de vista. Entiendo que estas son muchas preguntas. Cualquier ayuda o sugerencia será muy apreciada.

+0

No creo que el archivo GPX es leído por su aplicación, más por el propio simulador para alimentar ubicaciones en la aplicación. Hay una flecha de ubicación en Xcode en la que puede hacer clic para cargar su archivo GPX. También hay algunas ubicaciones predeterminadas que también podrías ver. –

Respuesta

7

Watanabe Toshinori sólo se convirtió en su nuevo mejor amigo (el mío también), el código está aquí:

http://github.com/FLCLjp/iOS-GPX-Framework

http://github.com/FLCLjp/GPX-Logger

http://github.com/FLCLjp/GPX-Viewer

+0

Muchas gracias Alexander, el marco parece realmente prometedor. – chatur

+0

El primer enlace en respuesta parece desactualizado. – Pang

+1

Sí. El proyecto github también fue abandonado durante mucho tiempo, pero la red de tenedores muestra una gran cantidad de horquillas prometedoras. Particularmente: https://github.com/webventil/iOS-GPX-Framework y https://github.com/kimar/iOS-GPX-Framework –

3

para responder a sus preguntas específicas:

  1. Sí, GPX es un muy buen formato para el intercambio de datos de localización. Eso es para lo que es.

  2. No tengo el código para hacer esto, pero tendrá que iterar sobre su matriz de CLLocations y construir la estructura de datos xml sobre la marcha. Use uno de los analizadores xml que admite escritura. (Ver el enlace a continuación).

  3. No hay un analizador GPX estándar en Objective C, pero GPX es solo xml, por lo que puede usar cualquier analizador xml que funcione con iOS o OSX. Ray Wenderlich tiene a very good tutorial on on using xml under iOS que explica cómo elegir el analizador correcto para sus necesidades. Esto no es específico de GPX, pero de nuevo GPX es solo un sabor de xml; los principios son los mismos

+0

Muchas gracias. Eso fue útil. Otra pequeña pregunta, ¿has usado GeoJSON? ¿cómo se compara su rendimiento con GPX? – chatur

+2

El rendimiento es toda otra pregunta. Me quedaría con GPX simple a menos que tus archivos sean tan grandes que el rendimiento sea un problema.Tenga en cuenta también que GPX admite conceptos de GPS como Pistas, Rutas y Puntos de referencia, pero GeoJSON es más parecido a GIS y usa Puntos, Líneas, Polígonos, etc. Puede usar cualquier formato, pero si representa rutas, GPX puede ser más natural. adecuado para su aplicación –

+0

Entendido. Gracias de nuevo amigo. – chatur

3

GPX muestra:

<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> 

archivo GPX (GPS eXchange Format) termina con .gpx extensión

Todo lo que tiene que hacer es simplemente iterar la matriz de CLLocations y crear las etiquetas (WPX) y guardar el archivo como. GPX

espero que esto ayuda a

+0

cómo escribir la ubicación del usuario en tiempo de ejecución en latitud larga en el archivo GPX – user1374

+0

Hay muchas bibliotecas de terceros para hacer eso y usted también puede hacerlo a través de la construcción de cuerdas. –

-1

Con Xcode 5, Add New File -> recursos -> track GPX.

+0

OP preguntaba cómo crear un archivo GPX personalizado a partir de una lista en la memoria de los puntos de CLLocation, no cómo crear un archivo GPX manualmente en Xcode. – worthbak

0

Aquí está en rápida 4 por si acaso alguien lo necesita con una UIAlert para entrar en el nombre del archivo

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 = "" 
    } 
} 
Cuestiones relacionadas