QGIS: Georeferenzierte Fotos auf einer Karte anzeigen

Rubrik: 

Hier wird ein Verfahren beschrieben, mit dem man unter Linux eine Sammlung georeferenzierter Fotos mit QGis auf einer Karte darstellen kann. Die Fotos können in beliebig geschachtelten Unterverzeichnissen liegen. Ausgewertet werden die EXIF-Tags GPSLongitude und GPSLatitude. In einem ersten Schritt werden die Fotos analysiert und eine CSV-Datei mit den Koordinaten erstellt. Im zweiten Schritt wird diese Datei in einen QGis-Layer geladen und der Layer so konfiguriert, dass die ein Foto beim Überfahren der Position mit der Maus angezeigt wird oder dass beim Klicken auf die Position ein externer Fotoeditor geöffnet wird.

Schritt 1: Erstellen einer CSV-Datei

In diesem Schritt wird das Programm exiftool eingesetzt. Dieses ist in den meisten Linux-Distributionen als Paket verfügbar. Der Aufruf

exiftool -csv -c "%+.6f" -GPSLongitude -GPSLatitude <fotodateien>

erzeugt eine CSV-Datei mit drei Spalten:

  • SourceFile: vollständiger Pfad der Fotodatei
  • GPSLongitude: geografische Länge
  • GPSLatitude: geografische Breite

Die erste Zeile enthält die Namen der Spalten. Die Koordinaten werden dezimal im WGS84/EPSG:4326-Referenzsystem ausgegeben.

Für eine begrenzte Anzahl von Fotos kann man die für den Schritt 2 benötigte CSV-Datei direkt mit diesem Aufruf von exiftool erzeugen. Das hat jedoch zwei Nachteile. Zum einen werden auch Fotos ohne Geo-Tags mit leeren Lon- und Lat-Werten in die CSV-Datei aufgenommen. Zum anderen ist die Länge der Argumentliste begrenzt und reicht daher nicht für große Fotosammlungen aus. Folgendes kleine Bash-Skript erstellt eine CSV-Datei, welche die georeferenzierten Fotos eines kompletten Verzeichnisbaums enthält:

ROOT=`pwd`
if [[ $# -eq 1 ]];then
    ROOT=$1
elif [[ $# -ne 0 ]];then
   echo "Aufruf: mkgeocsv [root-directory]"
   exit
fi
TMP=`mktemp`
find "$ROOT" -type d |\
while read CDIR;do
    exiftool -csv -c "%+.6f" -GPSLongitude -GPSLatitude \
               "$CDIR"/*jpg "$CDIR"/*JPG >> $TMP
done
echo "SourceFile,GPSLongitude,GPSLatitude" > "$ROOT"/geoloc.csv
awk -F\, '{if(NR!=1){\
              if($1=="SourceFile" || $2==""){\
                        next;\
               }
               print
           }
          }' $TMP >> "$ROOT"/geoloc.csv

Ein Link zum Herunterladen des Skripts befindet sich am Ende des Artikels.

Schritt 2: Anlegen des Layers in QGis

Sinnvollerweise wird in einem leeren Projekt zunächst ein Kartenlayer angelegt. Im Beispiel wird dafür mit OpenLayers-Plugin eine Rasterkarte von openstreetmap.org verwendet.

Importieren der CSV-Datei

Dialog Textdatei als Layer importieren öffnen:

Import der CSV-Datei

Die im Schritt 1 erstellte Datei in das Feld Dateiname eintragen:

Import-Dialog

Die übrigen Felder werden von QGis automatisch ausgefüllt. Bestätigt man die Eingabe mit OK, wird noch das Koordinatensystem für den Layer abgefragt. Hier wird WGS84/EPSG:4326 ausgewählt.

Der neue Layer erscheint im Layerfenster und die Positionen der Fotos werden als Punkte auf der Karte angezeigt. Streicht man mit der Maus über einen dieser Punkte, wird der Dateipfad der Fotodatei angezeigt.

Anzeige des Dateipfads

Anzeige des verkleinerten Fotos beim Überstreichen mit der Maus

Der Layer wird jetzt so konfiguriert, dass beim Überstreichen mit der Maus nicht der Pfad sondern ein Popup mit dem verkleinerten Foto angezeigt wird. Hierzu öffnet man den Eigenschaftsdialog des Layers und geht in das Tab Anzeigen und trägt dort einen Ausdruck ein, der den HTML-Code für die Anzeige des Fotos erzeugt:

HTML-Code für die Bildanzeige

Nun muss nur noch das Sprechblasensymbol (Kartenhinweise) in der Werkzeugleiste aktiv gesetzt werden, und schon erscheint das Foto, sobald die Maus über den zugehörigen Punkt geführt wird.

Anzeige des Fotos beim Überstreichen der Position mit der Maus

Öffnen des Fotos in einer Anwendung

Diese Funktion wird im Tab Aktionen des Eigenschaftendialog des Layers eingerichtet. Hierzu drückt man auf Voreingestellte Aktion hinzufügen, löscht alle Aktionen außer Datei öffnen und trägt dort als Aktion "[% "SourceFile" %]" ein.

Layereigenschaften - Aktionen

Damit die Aktion beim Klicken auf die Position eines Fotos ausgeführt wird, muss diese in der Werkzeugleiste aktiviert werden:

Aktion "Datei öffnen" aktivieren

Ein Klick auf die Position eines Fotos ruft jetzt die Standardanwendung für JPG-Dateien aus.

Datei: