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

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.
Hello World!

This is the personal website of Christoph Winkler.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets

Follow me on Twitter...

QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported