Ich habe mich beim Ansehen älterer Fotos schon so manches Mal gefragt, wo dieses Bild denn eigentlich entstanden ist. Um meiner Erinnerung hin und wieder auf die Sprünge zu helfen, habe ich einige meiner Fotos mit Geotags versehen. Hier erkläre ich einiges dazu.
Achtung: Big Brother liefert keine KML-Dateien mehr. Ich habe ein Tool geschrieben, mit dem man trotzdem Geotagging mit Googles Standortverlauf betreiben kann. Mehr dazu im verlinkten Artikel. Im Zuge dessen habe ich diesen Artikel auch etwas aktualisiert (2022-03-20).
Wenn ich mir im Nachhinein Fotos ansehen habe ich mich schon das eine oder andere Mal gefragt, wo ich diese nochmal aufgenommen habe. Klar, grob erinnere ich mich fast immer: Das eine war Norwegen, das andere Schweden und wieder ein anderes in den Niederlanden. Aber gerade bei toll eingefangenen Szenen wie einem norwegischen Gletschersee will ich es dann doch noch einmal genauer wissen. Hier beschreibe ich Wege, mit denen ich auch im Nachhinein Fotos mit Geotags versehen kann. So ein Geotag zeigt mir dann immer ganz genau, wo das Bild entstanden ist.
Digitale Fotos im JPEG- oder TIFF-Format enthalten einen Bereich zum Abspeichern von Metadaten im Exif-Format. 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 meist irgendwo an. 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.
Exif und Geotagging
Ich nutze das „exiftool„, um die Metadaten meiner Bilder anzuzeigen oder zu bearbeiten. In eigentlich allen Linux-Derivaten kann man dieses einfach aus den Repositories installieren. Anwender*innen von Windows und macOS finden das Tool auf auf der Website ExifTool.org. Es kann wahnsinnig viel. Hier konzentriere ich mich aber nur auf das Geotagging.
Um Fotos mit den richtigen Geotags zu versehen, müssen die Uhrzeit der Aufnahme und die jeweilige Position per GPS abgeglichen werden. Früher habe ich meine Wanderungen oft mit einem Garmin GPS aufgezeichnet. Heute lasse ich das hin und wieder meine Fitbit-Uhr machen. Zur Not kann aber auch Big Brother helfen, wenn man gar nichts aufgezeichnet hat.
Fotos mit Geotags versehen
Wichtig ist, dass die Uhrzeit der Kamera korrekt eingestellt ist. Vor allem beim Wechsel der Zeitzone werden sonst Bilder den Standort einige Stunden vor oder nach der Aufnahme zugeordnet. Hat man vergessen, die Kamera entsprechend einzustellen, so kann man diese Korrektur jedoch im Nachhinein vornehmen. Der folgende Befehl addiert einfach eine Stunde auf die Zeitstempel im Exif-Datensatz hinzu. Ein „-=“ würde dann entsprechend Zeit abziehen.
1 |
exiftool -alldates+=1 *.jpg |
Um nun die GPS-Daten in einem Ordner zu durchforsten und Positionen zu Bildern hinzuzufügen, ist der folgende Befehl notwendig:
1 |
exiftool -geotag 'GPX/*.gpx' *.jpg |
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 dieses Bild nicht bearbeiten. Dann kann/muss man sich mit Parametern wie -geosync weiterhelfen – im Manual kann man das nachlesen.
Du brauchst Orte und keine Koordinaten?
Die Koordinaten sind für Bildbetrachtungsprogramme schön und gut. Ich habe aber noch etwas weiter gespielt und herausgefunden, wie ich aus den Koordinaten noch Informationen wie den Namen der passenden Stadt herausfinden kann. Das brauche ich freilich nur selten … aber es ging und darum habe ich es gemacht. Konkret nutze ich dazu die Suchmaschine Nominatim von OpenStreetMap (OSM). Während Google seine Daten nur gegen komplexe Registrierungsvorgänge herausrückt, ist OSM als Open Data Projekt hier deutlich freundlicher zu handhaben.
Ich benötige für folgendes Voodoo neben dem exiftool noch ein Werkzeug, um GET-Aufrufe an eine Webseite zu senden und ein Tool, das JSON-Strings lesbarer macht. Für die GET-Aufrufe nutze ich cURL. Das gibt es in jeder Linux-Distribution. Zumindest in meinen Distributionen habe ich bisher auch immer jq gefunden. Damit wird der Umgang mit JSON-Strings sehr erträglich. Die erste Zeile liest die Geotags aus dem bild.jpg in die Variable $GPS ein. Die zweite Zeile sendet diese Geotags dann an Nominatim und erhält einen JSON-String zurück, den jq zu dem aufdröselt, was rechts im Bild zu sehen ist.
12 GPS=`exiftool -n -p 'lat=$GPSLatitude&lon=$GPSLongitude' bild.jpg`curl -s "https://nominatim.openstreetmap.org/reverse?format=json&$GPS&addressdetails=1&limit=1" | jq
Über einfachste Filter in jq kann ich mir dann die Daten aufbereiten. Möchte ich nach einer Tour durch ein Land zum Beispiel die Namen aller Städte im Dateinamen haben, so kann ich diese mittels jq ‚.address.country‘ einfach extrahieren und in einem Skript weiterverarbeiten.
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 takeout.google.com 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, 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
No responses yet