QGIS: No Data in Rasterlayer maskieren und füllen

In QGIS ignorieren Filter normalerweise Zellen mit No Data automatisch. Allerdings ist das nicht immer einfach, insbesondere wenn ein Filter benachbarte Zellen untersucht und diese No Data enthalten. Was dann passiert, hängt von der Implementierung ab, ist aber in beiden Fällen problematisch.

Zunächst ist „No Data“ in Rasterlayern mit einer bestimmten Zahl codiert, z.B. -9999. Wenn jetzt z.B. der Mittelwert innerhalb einer 3✕3-Nachbarschaft berechnet wird, kommt in der Umgebung jeder No-Data-Zelle natürlich Blödsinn heraus. Ersetzt man (in Numpy) die -9999 mit NaN (was es nur bei float gibt), führt das bei vielen Algorithmen dazu, dass die betreffende Zelle nun ebenfalls No Data wird, weil eine Berechnung nicht möglich ist. Die No-Data-Zellen stecken sozusagen ihre Nachbarschaft an.

Eine Möglichkeit ist, die No-Data-Zellen mit irgendeinem halbwegs sinnvollen Wert zu füllen. Dafür gibt es sowohl von QGIS selbst als auch über GDAL verschiedene Möglichkeiten, die allerdings den Nachteil haben, dass immer nur ein einziges Band verarbeitet wird. Man müsste also jedes Band einzeln verarbeiten und dann die Ergebnisse wieder zu einem Layer zusammenführen.

Mein neues QGIS-Plugin Scipy Filters (das ich im Blog bereits vorgestellt habe) erlaubt es, No-Data-Zellen in allen Bändern zu füllen, und zwar wahlweise mit:

  • Null
  • Einer benutzerdefinierter Konstanten
  • Dem Mittelwert des Bands (von GDAL geschätzt oder exakt berechnet)
  • Dem Minimalwert des Datentyps
  • Dem Maximalwert des Datentyps
  • Dem zentralen Wert des Datentyps

Später will man wahrscheinlich wissen, welche Zellen ursprünglich „No Data“ waren. Das Plugin kann auch eine No-Data-Maske (binäres Raster mit 0 und 1) erzeugen und diese Maske wiederum auf ein Raster-Layer anwenden, d.h. entsprechende Zellen wieder auf No Data setzen.