Fotos mit Geotags versehen

Bilder mit Geotags

Ich habe mich schon das eine oder andere Mal versucht zu erinnern, wo ich just das Foto X eigentlich geschossen habe. Gerade wenn ich im Urlaub – wie jetzt 😉 – fotografiere, möchte ich hinterher doch gern noch einmal wissen, wo das eigentlich war. Mit ein paar Open Source Tools habe ich mir Skripte gebaut, die mir nun dabei helfen.

Digitale Fotos im JPEG- oder TIFF-Format enthalten einen Bereich zum Abspeichern von Metadaten im Exif-Format [1]. Hier speichern Kameras und auch Smartphones Daten wie zum Beispiel die exakte Zeit der Aufnahme, die Blende, die Belichtungszeit oder auch den Namen des Objektivs ab. Bildbetrachtungsprogramme werten diese Meta-Daten aus und zeigen sie an, wenn das Foto geöffnet wird. Und genau in diesen Metadaten gibt es auch optionale Datenfelder für Geo-Koordinaten, die Geotags. Erweiterungen für digiKam oder Piwigo zeigen mit deren Hilfe auf Karten an, wo das Bild aufgenommen wurde.

Einfachstes Geotagging mit GPX-Dateien

Das Geotagging ist sehr einfach, wenn man folgende Zutaten zur Hand hat:

  • Die exakte Uhrzeit, zu der das Bild aufgenommen wurde
  • Einen GPX-Track, also die Aufzeichnung eines GPS-Gerätes über den zu einer gewissen Zeit zurückgelegten Weg
  • Einen Exif-Editor

Als passionierter Geocacher habe ich sehr oft mein GPS-Gerät beim Wandern dabei. Darin wird die Uhrzeit mit einer GPS-Position verknüpft und meine Kamera verknüpft dieselbe Uhrzeit mit dem aufgenommenen Foto. Ein Standardwerkzeug zum Bearbeiten von Exif-Informationen ist das ExifTool. Dieses gibt es eigentlich in allen Linux-Derivaten. Windows- und Mac-Benutzer können sich unter Umständen unter [2] helfen lassen. Der folgende Befehl …

exiftool -geotag ‚<GPX-Ordner>/*.gpx‘ *.jpeg

… verbindet nun die GPS-Positionen aus einer ganzen Menge von GPX-Dateien mit allen auf .jpeg-endenden Bildern im aktuellen Ordner. 

Das Programm berichtet beim Durchlauf, in wie viele Bilder ein Geotag eingefügt werden konnte. Es gibt hier nicht viel, was schief gehen kann. Wenn aber der letzte GPX-Fix (also die letzte genaue Position, die das GPS gemeldet hat) zu lange her gewesen sein sollte, so wird das exiftool diesen ignorieren. Dann kann/muss man sich mit Parametern wie -geosync weiterhelfen – im Manual kann man das nachlesen.

Du brauchst Orte und keine Koordintaten?

Die Koordinaten sind für Bildbetrachtungsprogramme schön und gut, doch möchte man vielleicht alle Bilder aus der Stadt Delft in den Ordner ‚Delft‘ sortieren. Dafür muss das Bild mit dem Ort ‚Delft‘ verknüpft werden. Hier hilft OpenStreetMap (OSM) weiter, genauer gesagt dessen Suchmaschine Nominatim [3]. Während Google seine Daten nur gegen komplexe Registrierungsvorgänge herausrückt, ist OSM als Open Data Projekt hier deutlich freundlicher zu bedienen.

Das Vorgehen ist eigentlich sehr einfach. Zunächst benötigt man die GPS-Daten. Diese liefert mir mein mit einem Geotag versehenes Bild. Weil ich es später so benötigen werde, lasse ich mir die Ausgabe gleich formatieren:

exiftool -n -p ‚lat=$GPSLatitude&lon=$GPSLongitude‘ bild.jpeg

Die Ausgabe dieses Befehls nenne ich der Einfachheit halber $GPS und benutze sie wie folgt in einer JSON-Abfrage an Nominatim:

curl -s „http://nominatim.openstreetmap.org/reverse?\
format=json&$PGS&addressdetails=1&limit=1“

Ausgabe von Nominatim für Koordinaten aus Delft

Die Ausgabe des Befehls kann über ‚| python -m json.tool‚ so formatiert werden, dass sie wie oben im Bild aussieht. Die Pipe ‚| jq ‚.address.city‘ | sed -es/“^\“\(.*\)\“$“/“\1″/‚ extrahiert daraus dann den Namen der Stadt. Unter [4] habe ich ein Skript dafür hinterlegt.

Kein GPS? Big Brother hilft …

Das ich Big Brother mal als hilfreich betitel, hätte ich auch nie gedacht ;-). Hier ist er es aber. Android-Telefone haben die Angewohnheit, ihre Position ständig zu Google zu berichten. Wenn kein GPS-Signal empfangen wird, dann nutzen sie dafür die umstehenden Mobilfunkmasten. Diese Information ist ungenau, aber meist noch immer besser als gar keine Information zu haben. Unter [5] kann man sich seinen persönlichen Standortverlauf herunterladen. Dazu muss das DropDown von JSON auf KML umgestellt und auf ‚weiter‘ geklickt werden. Nach kurzer Zeit kann man sich dann ein ZIP herunterladen, in dem sich eine Datei namens ‚Standortverlauf.kml‘ befindet.

Diese Datei bringt jedoch zwei Probleme mit sich:

  • Sie ist sehr groß, weil sie die gespeicherten Positionen mehrere Jahre enthält
  • Sie ist ungenau, weil einige WLANs falsche GPS-Koordinaten angeben

Hier helfe ich mir mit dem Tool GPSBabel [6], mit dem man GPS-Tracks editieren kann. Das Tool kennt den Parameter -x, der Filter anwendet. Ich rufe folgenden Befehl auf:

gpsbabel -i kml -f standortverlauf.kml \ 
-x track,start=$DATE,stop=$DATE1 \
-x transform,wpt=trk,del \
-x radius,distance=1oK,lat=$LAT,lon=$LON,nosort \ 
-x transform,trk=wpt,del \
-o gpx -F output.gpx

In der ersten Zeile wird die Standortverlauf-Datei im KML-Format übergeben. In der letzten Zeile wird die Ausgabe im GPX-Format erstellt. Die Zeilen dazwischen sind Filter:

  • track: extrahiert nur die Wegpunkte zwischen den beiden angegebenen Daten im Format YYYYMMDD
  • transform: generiert Wegpunkte aus dem Track, weil der folgende Filter nur auf Wegpunkte wirkt
  • radius: entfernt alle Wegpunkte jenseits eines 10km-Radius um die angegebenen GPS-Koordinaten
  • transform: macht aus den Wegpunkten wieder einen Track

Ein Skript für diesen Aufruf habe ich unter [7] hinterlegt.

 

[1] https://de.wikipedia.org/wiki/Exchangeable_Image_File_Format
[2] https://sno.phy.queensu.ca/~phil/exiftool/install.html
[3] https://nominatim.openstreetmap.org/
[4] Skript: reverse-gpx.sh
[5] https://takeout.google.com/settings/takeout/custom/location_history?hl=de&gl=DE&expflags
[6] https://www.gpsbabel.org/
[7] Skript: create-gpx.sh

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.