Inhaltsverzeichnis
2013-08-13 // GPSBabel: CSV in GPX umwandeln
Von der letzten Alpentour habe ich ein Haufen GPS-Tracks in Form von CSVs, die ich in GPX-Dateien umwandeln möchte, damit ich sie in meinem lokalen phpMyGPX hochladen kann. Für die Konvertierung bietet sich das Tool GPSBabel an. Meine CSVs haben folgende Stuktur:
name , latitude, longitude, elevation 08/09/2013 10:42:29, 46.46014, 9.93731, 1873.90 08/09/2013 10:42:30, 46.46015, 9.93730, 1873.40 08/09/2013 10:42:31, 46.46015, 9.93730, 1873.00
Die Syntax für GPSBabel lautet:
$ gpsbabel [options] -i INTYPE -f INFILE -o OUTTYPE -F OUTFILE
Für INTYPE
und OUTFILE
muss ein passendes Format ausgewählt werden. Dies wäre für OUTFILE
natürlich gpx
, für INFILE
habe ich zuerst xcsv
und schließlich unicsv
gewählt.
Erster Ansatz: XCSV Format
Zunächst habe ich ein im folgenden ersichtliches XCSV Style File erstellt, um die Daten mit dem XCSV Format zu konvertieren. Die Dokumentation zu den Parametern findet sich in der Dokumentation von GPSBabel.
# gpsbabel XCSV style file DESCRIPTION Comma separated values SHORTLEN 8 # # FILE LAYOUT DEFINITIIONS: # FIELD_DELIMITER COMMASPACE RECORD_DELIMITER NEWLINE BADCHARS COMMA # # INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE: # IFIELD GMT_TIME, "", "%m/%d/%Y %H:%M:%S" #08/10/2013 13:49:14 IFIELD LAT_HUMAN_READABLE, "", "%08.5f" IFIELD LON_HUMAN_READABLE, "", "%08.5f" IFIELD ALT_METERS, "", "%3.0fM"
Mein Ansatz war dann den CSV-Track in ein GPX-File umzuwandeln:
$ gpsbabel -i xcsv,style=test.style -f test.csv -o gpx -F test.gpx
…was aber eine GPX-Datei mit Waypoints zurückgibt. Leider kann GPSBabel mit XCSV nur Waypoints lesen:
$ gpsbabel -t -i xcsv,style=test.style -f test.csv -o gpx -F test.gpx XCSV attempt to read test.csv as a track or route, but this format only supports waypoints on read. Reading as waypoints instead.
Also habe ich probiert die Waypoints beim Umwandeln gleich in einen Track zu „transformieren“:
$ gpsbabel -i xcsv,style=test.style -f test.csv -x transform,trk=wpt -o gpx -F test.gpx
Diese Lösung war aber auch nicht von Erfolg gekrönt war – es kamen wieder nur Waypoints raus
Die Lösung: Universal csv Format
Zum Glück bin ich dann auf das Universal csv Format von GPSBabel gestoßen, was die Spalten direkt an der Headline erkennt und CSV-Dateien auch als Tracks lesen kann. Dazu musste ich die erste Zeile der CSV-Datei wie folgt ändern:
utc_t , lat , lon , elevation #name , latitude, longitude, elevation 08/09/2013 10:42:29, 46.46014, 9.93731, 1873.90 08/09/2013 10:42:30, 46.46015, 9.93730, 1873.40 08/09/2013 10:42:31, 46.46015, 9.93730, 1873.00
Anschließend konnte ich ein erstes Testfile erfolgreich konvertieren:
$ gpsbabel -t -i unicsv -f test.csv -o gpx -F test.gpx
Das Ergebnis ist eine brauchbare GPX-Datei des Tracks:
<?xml version="1.0" encoding="UTF-8"?> <gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> <time>2013-08-13T18:40:02Z</time> <bounds minlat="46.415400000" minlon="9.924930000" maxlat="46.460160000" maxlon="9.941560000"/> <trk> <trkseg> <trkpt lat="46.460140000" lon="9.937310000"> <ele>1873.900000</ele> <time>2013-08-09T10:42:29Z</time> </trkpt> (...)
Um das nun nicht mit jeder Datei einzeln machen muss, konvertiere ich die CSV-Files, die ich einem extra Order abgelegt habe, mit einer einfachen For-Schleife:
$ for i in $(ls *.csv) ; do gpsbabel -t -i unicsv -f $i -o gpx -F ${i%csv}gpx ; done
Comments
Leave a comment…
- E-Mail address will not be published.
- Formatting:
//italic// __underlined__
**bold**''preformatted''
- Links:
[[http://example.com]]
[[http://example.com|Link Text]] - Quotation:
> This is a quote. Don't forget the space in front of the text: "> "
- Code:
<code>This is unspecific source code</code>
<code [lang]>This is specifc [lang] code</code>
<code php><?php echo 'example'; ?></code>
Available: html, css, javascript, bash, cpp, … - Lists:
Indent your text by two spaces and use a * for
each unordered list item or a - for ordered ones.
Danke für den Tipp mit dem Universal csv Format!