2012-01-03 19 views
8

La mia applicazione deve condividere l'array di CLLocations (Route) all'interno dei dispositivi utilizzando l'applicazione. Non ho esperienza sull'uso di GPX prima di questo. GPX è il miglior formato per farlo? Come posso creare un file GPX da una tale matrice di CLLocations? e c'è un parser GPX standard in Objective C? Da quello che ho cercato in rete e così rispondere a queste domande sono rispettivamenteCreazione del file GPX dall'array di 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 

sarò felice se ottengo risposte alternative/viste. Capisco che queste sono molte domande. Ogni aiuto o suggerimento sarà enormemente apprezzato.

+0

Non credo il file GPX viene letto dalla vostra applicazione, più per il simulatore di sé per alimentare posizioni nell'app. C'è una freccia di posizione in Xcode che puoi cliccare per caricare il tuo file GPX. Ci sono anche alcune posizioni predefinite che probabilmente potresti anche guardare. –

risposta

7

Watanabe Toshinori appena diventato il tuo nuovo migliore amico (anche la mia), il codice è qui:

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

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

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

+0

Grazie mille Alexander, Framework in effetti sembra promettente. – chatur

+0

Il primo collegamento in risposta sembra obsoleto. – Pang

+1

Sì. Anche il progetto github è stato abbandonato da tempo, ma la rete di fork mostra molte forcelle promettenti da esaminare. In particolare: https://github.com/webventil/iOS-GPX-Framework e https://github.com/kimar/iOS-GPX-Framework –

3

per rispondere alle vostre domande specifiche:

  1. Sì, GPX è un formato molto buono per la condivisione di dati di localizzazione. Ecco a cosa serve

  2. Non ho il codice per eseguire questa operazione ma è necessario eseguire un'iterazione sull'array di CLLocations e costruire la struttura di dati xml mentre si va. Utilizza uno dei parser xml che supporta la scrittura. (Vedi il link sottostante).

  3. Non esiste un parser GPX standard nell'obiettivo C, ma GPX è solo xml, quindi è possibile utilizzare qualsiasi parser xml che funzioni in iOS o OSX. Ray Wenderlich ha a very good tutorial on on using xml under iOS che spiega come scegliere il parser adatto alle proprie esigenze. Questo non è specifico per GPX, ma di nuovo GPX è solo un assaggio di xml; i principi sono gli stessi.

+0

Grazie mille. E 'stato utile. un'altra piccola domanda, hai usato GeoJSON? come sono le sue prestazioni rispetto a GPX? – chatur

+2

La prestazione è tutta un'altra domanda. Rimanerei con una semplice GPX a meno che i tuoi file non siano così grandi che le prestazioni sono un problema.Nota anche che GPX supporta concetti GPS come Tracce, Rotte e Waypoint, ma GeoJSON è più simile a GIS e utilizza Punti, Linestazioni, Poligoni, ecc. Puoi usare entrambi i formati, ma se rappresenti percorsi allora GPX potrebbe essere più naturale adatto per la tua applicazione –

+0

Grazie ancora amico. Aggiornamento – chatur

3

GPX Esempio:

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

di file GPX (GPS eXchange Format) si conclude con .gpx estensione

Tutto quello che dovete fare è semplicemente scorrere la matrice di CLLocations e creare i tag (WPX) e salvare il file come. gpx

spero che questo aiuta

+0

come scrivere la posizione dell'utente di runtime lat long nel file GPX – user1374

+0

Ci sono molte librerie di terze parti per farlo e puoi farlo da solo anche con la costruzione di stringhe. –

-1

Con Xcode 5, Aggiungi nuovo File -> risorsa -> File GPX.

+0

L'OP chiedeva come creare un file GPX personalizzato da un elenco in memoria dei punti CLLocation, non come creare manualmente un file GPX in Xcode. – worthbak

0

Qui è in rapida 4 solo nel caso in cui qualcuno ha bisogno con un UIAlert per entrare il nome del file

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