Aufgrund von Nodata-Pixeln können keine Raster summiert werden


11

Ich habe eine Reihe von Rastern (.vrt) mit täglichen Bodenfeuchtedaten. Ich möchte die Pixel aller Raster summieren, um ein Maß pro Monat zu erhalten. Es wird jedoch nicht jeden Tag die ganze Welt abgedeckt, was zu Knotenwerten an Orten führt, an denen für die anderen Tage Maßnahmen existieren.

Was ich tun möchte, ist die Summe der Werte jedes Rasters. Es scheint jedoch, dass jedes Mal, wenn ein Nodata-Pixel in der Summe enthalten ist, das resultierende Pixel direkt als Nodata kategorisiert wird. Ich hätte gerne das Gegenteil: alle Nodata-Werte ignorieren und den Rest summieren.

Ich dachte an zwei Möglichkeiten, das Problem zu lösen:

  1. Summieren von Rastern, die Knotenwerte ignorieren
  2. Konvertieren Sie Nodata-Pixel in den Wert 0 und summieren Sie dann alle Raster

Geben Sie hier die Bildbeschreibung ein

Leider kann ich dafür kein Werkzeug finden.

Kann mir jemand helfen?


Ich frage mich, wie interpretierbar das Ergebnis sein wird: Schließlich enthalten die Summen nicht die Werte für die fehlenden Tage, was darauf hinweist, dass sie je nach Menge der fehlenden Daten um verschiedene Beträge niedrig verzerrt sind. Wenn eine nennenswerte Menge fehlender Daten vorhanden ist, sollten Sie stattdessen die Werte in den fehlenden Zellen unterstellen oder vorhersagen und dann die Summe ausführen.
whuber

1
Danke für diesen Kommentar. Ich habe die Manager der Daten gefragt und sie sagten, sie hätten den Mittelwert berechnet, indem sie alle verfügbaren Daten summiert und dann durch die Anzahl der Tage innerhalb des Monats dividiert, an denen Beobachtungen auf diesem Pixel verfügbar sind.
Damien

2
Dies ist identisch mit dem lokalen Mittelwert eines Stapels von Rastern, bei dem das GIS angewiesen wird, nur alle NoData-Zellen zu ignorieren, was einen anderen Weg für Sie vorschlägt. Übrigens ist dieses Verfahren möglicherweise immer noch voreingenommen, wenn die fehlenden Beobachtungen mit den Werten korreliert sind. Wenn Ihnen beispielsweise aufgrund der Wolkendecke Daten fehlen, ist es plausibel, dass an diesen Tagen die Bodenfeuchtigkeit (im Durchschnitt) höher ist als gewöhnlich.
whuber

1
Okay, ich habe gerade das Zellstatistik-Tool mit aktivierter Option "Knoten ignorieren" getestet und es macht genau das, was ich wollte. Mir sind die Mängel einer solchen Methode bekannt. Meine Arbeit ist jedoch räumlich und zeitlich ziemlich umfangreich, daher gehe ich davon aus, dass solche Vorurteile weniger wichtig sein werden. Wie auch immer, ich habe nicht wirklich so viel Auswahl an Daten.
Damien

Die Skala wird nicht mit dem Ausmaß der Vorspannung in Beziehung gesetzt. Die Bedeutung der Verzerrung hängt von ihrer Größe und der Empfindlichkeit Ihrer Anwendung ab. Auch wenn Sie nichts über die Daten möglicherweise in der Lage zu tun, Sie haben die Kontrolle über die Verfahren für sie zu analysieren. Es gibt viele Möglichkeiten, dies zu verbessern. Zu Ihren Optionen gehört die zeitliche Interpolation und die Regression gegen Kovariaten, die möglicherweise mit der Bodenfeuchtigkeit korrelieren und auch an den fehlenden Daten verfügbar sind. (Es gibt eine ganze
Reihe

Antworten:


1

Wenn Sie Zugriff auf ArcGIS haben dann die Zellenstatistik hat Werkzeug , um die optional zu nodata ignorieren , die Sie summieren \ Mittelwert \ min \ max Ihre Rastern.


Wenn Sie diese Antwort so ändern, dass "Summe" durch "Durchschnitt" ersetzt wird, ist sie korrekt: Den Kommentar finden Sie im Kommentarthread zur Frage.
whuber

Das Summieren war nur ein Teil meines Problems, da ich den Mittelwert erhalten möchte. Ich habe es gerade überprüft, und das Tool für die Zellstatistik ist auch der einfachste Weg, Raster ohne Berücksichtigung von Nodata-Pixeln zu summieren.
Damien

11

Erstens können Sie mit gdal_calc.py alle -9999 auf 0 ändern und den NoData-Wert auf 0 setzen.

Zum Beispiel:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Anschließend können Sie den NoData-Wert mit gdal_translate mit der Option -a_nodata gefolgt von none ignorieren .

-a_nodata value :

Weisen Sie den Ausgabebändern einen angegebenen Knotenwert zu. Ab GDAL 1.8.0 kann auf none gesetzt werden , um zu vermeiden, dass ein Knotenwert für die Ausgabedatei festgelegt wird, falls einer für die Quelldatei vorhanden ist

Beispiel:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Danke für den Tipp. Ich habe ein wenig mit dem Parameter -a_nodata gespielt und es gelingt mir, den Wert -9999 anstelle von NULL zu haben. Allerdings muss ich noch alle -9999 Pixel auf 0 ändern
Damien

1
Sie können gdal_calc.py verwenden , um alle -9999 auf 0 zu ändern, bevor Sie sich bewerben gdal_translate -a_nodata none .... Zum Beispiel: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

Ich habe mehrere Befehle ausprobiert, aber ich glaube wirklich, dass ich ein Problem mit gdal_calc.py habe. Zum Beispiel habe ich gerade versucht, dem gesamten Raster 1 hinzuzufügen ( i.imgur.com/WiZG7MC.png ), und ich habe diesen Maxrepeat-Fehler erhalten. Ich verstehe nicht, ich habe den Befehl direkt von der OSGeo-Shell ausgeführt, und dieses Modul scheint korrekt installiert zu sein, da es in der Liste angezeigt wird, wenn ich die Shell öffne ( i.imgur.com/fgtMZQZ.png ). Ist meine Installation kaputt?
Damien

Es scheint ein Regex-Problem zu sein ... Versuchen Sie, Ihr Arbeitsverzeichnis mit dem cdBefehl zu ändern, und versuchen Sie es erneut , um nur zu haben -A test.tif.
Antonio Falciano

1
Es funktioniert für mich, aber ich habe all diese Dinge über das OSGeo4W-Installationsprogramm installiert . Stattdessen sehe ich, dass Sie QGIS über das eigenständige Installationsprogramm installiert haben. Versuchen Sie also, Ihr Setup zu aktualisieren.
Antonio Falciano

5

In R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

Können Sie diesem Code eine Erklärung hinzufügen (falls Sie ihn geschrieben haben) oder einen Link zu der Stelle, an der Sie ihn gefunden haben, mit einer kurzen Zusammenfassung der Website?
Paul

1
Das Obige lädt zuerst das Rasterpaket und erstellt dann einen "Stapel" (ein dreidimensionales Array von Rasterdateien mit identischer Ausdehnung und Auflösung, wobei jede Datei zu einem Teil dieses Stapels wird), der die durch die durch Kommas getrennten Dateinamen angegebenen Dateien enthält . Die letzte Zeile führt zellweise Summen über alle Stapelscheiben aus s, wobei das Argument dazu führt, na.rm=TRUEdass NAWerte ignoriert werden. Das Ausgabeobjekt ssist ein rasterObjekt, mit dem exportiert werden kann writeRaster(siehe ?writeRaster). (@RobertH ist der Schöpfer des R- rasterPakets.)
jbaums

1

Das bedingte Tool in Spatial Analyst ist eine einfache Möglichkeit, Nullwerte in Nullen umzuwandeln. Dann sollte es ein Kinderspiel sein, die Summen zu nehmen.


Danke für Ihre Antwort. Ich bin diesem Beitrag gefolgt: support.esri.com/fr/knowledgebase/techarticles/detail/34932 und konnte alle Nullpixel in 0 konvertieren. Ich hätte diesen Vorgang jedoch gerne für alle Raster innerhalb von a ausführen können Verzeichnis. Die 'Rasterwerte neu klassifizieren' in QGIS scheinen dazu in der Lage zu sein, aber alles, was ich nicht weiß, wie es funktioniert. Ich wähle die Methode "Einfache Tabelle" und fordere sie auf, null auf 0 zu setzen und keine anderen Werte zu ändern, aber das resultierende Raster reicht von -0,99 bis 0,08, während es ursprünglich von 428 bis 3491 reicht
Damien

Können Sie irgendwo einen Auszug Ihres Original-Rasters veröffentlichen, damit wir einen Blick darauf werfen können?
bis

2
Wenn Sie mit der rechten Maustaste auf das Tool klicken, können Sie einen Stapelprozess für so viele Dateien ausführen, wie Sie möchten, dh für ein gesamtes Verzeichnis.
Brock

Danke für deine Antwort. Ich kann jedoch alle NULL-Werte für eine einzelne Datei mit 'Spatial Analyst / Map Algebra / Raster Calculator' in 0 konvertieren. Wenn ich mit diesem Tool richtig klicke, kann ich ein Verzeichnis stapeln, aber wie lautet die Syntax, um jede Datei automatisch zu berücksichtigen? ( i.imgur.com/aYaUCzz.png )
Damien

Ich habe mir das Tool "Spatial Analyst / Reclass / Reclassify" angesehen und es macht genau das, was ich will. Ich habe es geschafft, das Stapelfenster zu verwenden, um mehrere Dateien gleichzeitig zu verarbeiten. Ich habe ein letztes Problem: Wenn ich mit der rechten Maustaste auf das 'Ausgabe-Raster' klicke / es fülle, werden die gleichen Ausgabedateien für alle Eingabe-Raster kopiert. Wie kann ich dafür sorgen, dass für jede Eingabe eine andere Ausgabe erstellt wird? ( i.imgur.com/jzTI2x9.png )
Damien

1

Ich hatte vor einiger Zeit das gleiche Problem und konnte es lösen.

Nur als Hinweis zur Anzeige von Knotenwerten in QGIS: Knotenwerte werden immer als Knotenwerte im Kartenfenster und bei Verwendung des Werkzeugs "Objektinformationen" angezeigt, unabhängig davon, ob sie tatsächlich den Wert -9999, 0, NULL usw. Haben Wenn Sie also nach der Neuklassifizierung der Knotenwerte in 0 in die Ebeneneinstellungen gehen, finden Sie in den Metadaten, dass Knoten den Wert 0 haben.

Ich habe endlich das perfekte Werkzeug für die Suche gefunden, das GRAS r.series. Wenn die Option "Aggregatoperation" auf "Maximum" und die Option "NULL-Werte weitergeben" deaktiviert ist, erstellt das Tool eine Ebene, die Ihren Anforderungen entspricht.


0

Ich erinnere mich, dass ich dieses Problem vor einiger Zeit hatte. Als Lösung denke ich, dass ich +1 für alle Zellen im Raster gemacht, die Raster addiert und dann eine letzte Subtraktion durchgeführt habe (von wie vielen +1 Sie auch immer hinzugefügt haben). Es ist ziemlich grob, aber wenn es den Job erledigt ...!

Verwenden Sie alternativ die Option "Rasterwerte neu klassifizieren" in der Toolbox "Verarbeitung" in QGIS, um Ihre Nullwerte in Null zu konvertieren.


Hallo, ich habe viele Möglichkeiten ausprobiert, das Tool "Rasterwerte neu klassifizieren" ohne Erfolg zu verwenden. Ich habe mit einem Raster begonnen, bei dem ich alle NULL-Pixel in -9999 konvertiert habe. Ich habe versucht, mit der Methode [0] single neu zu klassifizieren und 'alter Wert = -9999', 'neuer Wert = 0.0', 'Operator: [0] =' gesetzt, aber alles, was ich bekomme, ist ein Raster voller 'nan' Pixel. Was mache ich falsch?
Damien
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.