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

// Kurztipp: Audio aus VDR Aufnahmen extrahieren

Ich nehme hin und wieder mit einem Video Disk Recorder (VDR) Konzerte (BEATZZ in Concert, Rock am Ring, Rock im Park, usw.) auf. Da so ein TS File doch relativ groß ist und es mir eigentlich nur um die Audiospur geht, die ich dann bequem unterwegs hören kann, extrahiere ich jene mit FFmpeg und schneide sie anschließend mit Audacity zu.
FFmpeg kann nun z.B. mit folgendem Befehl angewiesen werden die Audiospur als MP3 File zu extrahieren:

$ ffmpeg -i 00001.ts -acodec libmp3lame -f mp3 -ab 192k -ar 48000  Metallica_RaR.mp3

…alternativ natürlich auch als Ogg oder AAC File:

$ ffmpeg -i 00001.ts -acodec libvorbis -f ogg -ab 192k -ar 48000  Metallica_RaR.ogg
$ ffmpeg -i 00001.ts -acodec libfaac -f aac -ab 192k -ar 48000  Metallica_RaR.aac

Dabei muss sichergestellt werden, dass die entsprechenden Codecs (z.B. libmp3lame0 libfaac0 libavcodec-extra-52) installiert sind.

// Die Wundergound Weather API – endlich eine brauchbare

Seit längerem befinde ich mich auf der Suche nach (brauchbaren!) externen Wetterdaten für Weather.chrisge.org – Die Google Wetter API existiert schon seit längerem nicht mehr und das YAHOO! Pendant ist auf Grund nicht enthaltener Werte für mich unbrauchbar geworden. Zunächst bin ich dann dazu übergegangen die deutsche Unterseite von TheWeatherChannel zu dumpen. Da die Seite aber einen Relaunch erlebt hat und ich keine Lust mehr auf ständiges Anpassen der Munin Plugins hatte, habe ich mich auf die Suche nach einer brauchbaren API gemacht und in der Wunderground.com Weather API eine hervorragende gefunden.

Features

Als Entwickler bekommt man den API-Zugang mit sämtlichen Zusatzfeatures für lau. Darin enthalten ist folgendes:

  • Anvil Plan mit Radar- und Satellitenbilder, Webcam Thumbnails und vielen mehr oder weniger brauchbaren Features
  • das History Add-On („one of the biggest historical weather databases on the web“)
  • …und eine Limitierung auf 10 Anfragen pro Minute und 500 pro Tag :-(

Nach dem man sich für einen API Key registriert hat, empfiehlt es sich zunächst sich etwas in der Dokumentation umzusehen. Es fällt auf, dass in die Anwendung bzw. in die Webseite das Wunderground Logo eingebunden werden muss, was auf Grund der sehr humanen Vorschriften (das „Horizontal Logo“ darf auf 126px skaliert werden) absolut kein Problem darstellt.

Einfache Abfragen

Eine Übersicht über mögliche Abfragemethoden findet sich in der Dokumentation. Unter anderem können auch sog. Layers erzeugt werden (sehr empfehlenswert!). Für mich war aber in erster Linie eine Abfrage der Conditions relevant, weshalb ich mich im folgenden auch nur mit diesen beschäftigen werde.

Zunächst muss entscheiden werden, ob die Antwort in XML oder JSON „formatiert“ sein soll. Ich entscheide mich für JSON. Eine Abfrage nach den aktuellen Conditions sieht nun in etwa so aus (wobei die Variablen natürlich ersetzt werden müssen):

http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json

Den Ortscode ${PLACE} erhält man, indem man auf der Startseite nach dem Ort sucht und sich die URL anschaut (z.B. für Schutterwald http://www.wunderground.com/q/zmw:00000.47.10805zmw:00000.47.10805). Ich wähle folgende Werte für die Variablen:

KEY=""                         # generierten API Key angeben
OPTIONS="lang:DL"              # Sprache auf Deutsch
PLACE="zmw:00000.47.10805"     # Ortscode für Schutterwald...
PLACE="zmw:00000.1.10702"      # bzw. für Karlsruhe

Die Abfrage kann nun testweise im Browser oder natürlich auch mit einem Textbrowser wie w3m oder lynx ausgeführt werden:

w3m -dump http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json

Als Antwort erhalte ich für die Wetterbedingungen in Karlsruhe unter anderem folgendes (stark gekürzt):

"weather":"Partly Cloudy",
"temp_c":12.2,
"relative_humidity":"85%",
"wind_string":"Calm",
"wind_dir":"WSW",
"wind_degrees":242,
"wind_kph":0.0,
"wind_gust_kph":"1.6",
"pressure_mb":"1001",
"dewpoint_c":10,
"feelslike_c":"12.2",
"visibility_km":"10.0",
"UV":"1",

Die darin enthalten Werte sind für meine Bedürfnisse mehr als ausreichend :-)

Eine praktische Umsetzung

Zuerst scheinen 500 Anfragen pro Tag ausreichend. Das würde immerhin alle drei Minuten eine Anfrage gestatten. Das Problem ist nur, dass ich drei Munin Plugins einsetze, die alle 5 Minuten zweimal (wegen zwei Muninmastern) ausgeführt werden. Außerdem frage ich die Werte hin und wieder für den Versand via SMS oder XMPP ab. Folglich muss eine andere Lösung her.
Dazu habe ich folgendes kleine Skript (api-get) erstellt, welches mir die Werte für Schutterwald abfrägt bzw. mit wget downloaded:

#!/bin/bash
 
FILE="/var/weather/output_sw"      # Pfad anpassen
KEY=""                             # Key einfügen!
OPTIONS="lang:DL"
PLACE="zmw:00000.47.10805"         # Ortscodes/Variablen anpassen!
 
wget -q http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json -O $FILE

Das obige Skript führe ich alle 4 Minuten in Cron aus.

Das $FILE verarbeite ich nun mit allen weiteren Services, die Zugriff auf die Wetterdaten brauchen, mit folgendem Skript (api):

#!/bin/bash
FILE="/var/weather/output_sw"    # Ort anpassen
WHAT="$1"
 
case "$WHAT" in
 
# Verarbeiten von $FILE; JSON lässt sich in der bash sicherlich auch schöner verarbeiten ;-)
temp)
   grep temp_c $FILE | cut -d':' -f2 | cut -d',' -f1
   ;;
 
dew)
   grep dewpoint_c $FILE | cut -d':' -f2 | cut -d',' -f1
   ;;
 
hum)
   grep relative_humidity $FILE | cut -d':' -f2 | cut -d',' -f1 | cut -d'"' -f2 | cut -d'%' -f1
   ;;
 
*)
   echo "ERR: WHAT!"
   exit 1
   ;;
esac

Nun kann ich mit /Pfad/zum/api/skript [temp|dew|hum] die aktuellen Werte aus der heruntergeladenen Datei auslesen. Natürlich muss der jew. User Zugriff auf die Datei haben und die benötigten Rechte besitzen um das Skript ausführen zu dürfen!

Fazit

Ich hoffe der Wetter API von Wunderground.com ist ein längeres Leben als der von Google prophezeit. Ende Dezember bin ich auf die Wundeground Weather API umgestiegen und ich muss sagen, dass ich höchst zufrieden bin.
Bis jetzt habe ich noch nicht alle Möglichkeiten der API ausgeschöpft, mit den History und Layer Feeatures muss ich mich unbedingt noch mehr auseinandersetzen.

// Jahresrückblick mal anders: Jahresraffer 2012

So zum Jahresende habe ich mir gedacht, ich erstelle eine Timelapse für das ganze Jahr 2012. Snapshots habe ich dabei aber vom Zeitraum 28.12.2011 bis 28.12.2012 (und nicht vom 1.12.2012 - 31.12.2012) jew. von 17 Uhr ausgewählt und mit ffmpeg zusammengeschnitten. Ich hoffe man sieht nicht nur, wie sich die Webcam abgesenkt hat, sondern auch den Verlauf der Sonne.


→ Timelapse No.8 – One Year in Schutterwald auf Vimeo, sowie weitere Timelapses auf meinem Vimeo Channel

Hierzu die passenden Wetteraufzeichnungen von Weather.chrisge.org, die mittlerweile ebenfalls über ein Jahr zurückreichen:

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