Nodata-Wert in QGIS neu auf Null definieren?

7

Ich habe ein Bild, das ich mit einem AOI-Polygon geschnitten habe. Der Konturbereich wurde auf Pixelwert = 0 gesetzt und ich habe einen Knotenwert von -32768. Ich möchte den Nodata-Wert in Null neu definieren. Früher habe ich dies mit ArcMap einfach im Rasterrechner gemacht, aber in QGIS sehe ich nicht, wie ich es machen könnte. Irgendwelche Ideen?

vascobnunes
quelle
2
Möchten Sie es nur zur Visualisierung oder müssen Sie es auf null setzen, um weitere Rasterberechnungen durchzuführen?
Maning

Antworten:

13

In QGIS können Sie den Rasterrechner mit der folgenden Berechnung verwenden:

("your_raster" != -32768) * "your_raster"

Wenn bei dieser Berechnung der Zellenwert -32768 ist, erhalten Sie in dieser Zelle eine 0, und wenn er sich von -32768 unterscheidet, behält die Zelle den Wert bei, den sie hatte.

Egidi
quelle
1
Schöne Lösung. Nur ein Hinweis für andere, die dies versuchen: In QGIS finden Sie den Knotenwert für eine Ebene unter den Ebeneneigenschaften, dann unter Informationen (oberes Element) und scrollen Sie nach unten zu Bänder.
John
Beachten Sie, dass dies bei Werten wie -3.40282e + 38 nicht funktioniert.
Georgie
12

Die einfachste einstufige und IMO beständigste und zuverlässigste Lösung für die Neuklassifizierung von NoData auf Null ist die Verwendung des SAGA-Tools (Reclassify Grid Values) in der Verarbeitungs-Toolbox.

Scrollen Sie nach Auswahl des zu klassifizierenden Rasters einfach zum Ende des Dialogfelds und stellen Sie sicher, dass das replace no data valuesKontrollkästchen aktiviert ist. Der Standardwert ist Null (aber Sie können natürlich auch etwas anderes ersetzen). Deaktivieren Sie dann das Kontrollkästchen replace other valuesund lassen Sie alle anderen Felder in Ruhe (Sie müssen also nur sicherstellen, dass ein Kontrollkästchen aktiviert ist, und ein anderes deaktivieren - es sind keine weiteren Einstellungen erforderlich).

MappaGnosis
quelle
1
Genau. Nichts anderes hat wirklich für mich funktioniert (mein Nodata-Wert war so etwas wie -3,4e + 38).
ArMoraer
Hatte genau das gleiche Problem wie @ArMoraer. Dies war die einfachste Lösung, funktionierte perfekt.
Rauni
Ich habe das Problem mit den Nodata auf 0 behoben, aber bis dahin hat es kleine Änderungen an meinen anderen Rasterwerten vorgenommen
ZKB
Leider scheint diese Methode in QGIS 3.8 nicht mehr zu funktionieren. Das Verarbeitungsformular wird nicht ausgeführt, ohne alle anderen Einstellungen zu ändern. Fehler: "Falscher oder fehlender Parameterwert: ...."
geordie
11

Ich habe eine Lösung dafür gefunden. Zuerst konvertiere ich das Bild in eine vrt-Ebene (gdalbuildvrt) mit -srcnodata 0, dann übersetze ich es zurück in eine tif-Datei mit gdal_translate -a_nodata. Hat gut funktioniert! :) :)

vascobnunes
quelle
8

Ich denke, Sie können das mit dem Rasterrechner tun .

Wenn nicht mit Hilfe von GRASS Plugin und r.null werden Sie es einfach tun. Diese Option bedeutet, dass Sie zuerst ein GRASS-Mapset erstellen müssen, um Ihr Raster zu importieren.

simo
quelle
5
Könnten Sie näher erläutern, wie das mit dem Rasterrechner geht?
Rudivonstaden
1
r.nullhabe es für mich getan.
Metasequoia
8

Da ich das gleiche Problem hatte, habe ich am Ende Python direkt verwendet - möglicherweise müssen Sie numpy.where für Ihren speziellen Zweck anpassen. Im folgenden Fall bleiben die Pixelwerte unverändert, wenn sie> = 0 sind. Alle anderen Pixel - in diesem Fall nur diejenigen mit dem Wert ohne Daten - werden auf "0" gesetzt.

import gdal, gdalconst, numpy
maskfile = gdal.Open('C:\Users\max\Desktop\Baltic2.tif', gdalconst.GA_Update)
maskraster = maskfile.ReadAsArray()
maskraster = numpy.where((maskraster >= 0), maskraster, 0 ) 
maskband = maskfile.GetRasterBand(1)
maskband.WriteArray( maskraster )
maskband.FlushCache()
Max
quelle
1

Ich habe versucht, sowohl das Rastercalc-Plugin als auch den Raster-Rechner zu verwenden, und keiner hat funktioniert - Syntaxfehler. Was funktionierte, war das Warp-Tool und die Angabe der Quell- und Ziel-Nodata-Werte (siehe Antwort von underdark auf eine ähnliche Frage Wie kann man fehlende Werte von der Rasterebene ausschließen? )

Florenz
quelle
1

Was für mich funktioniert hat, war, das Raster als .asc-Datei zu exportieren, dann in einem Texteditor zu öffnen und mithilfe von Suchen und Ersetzen den alten NoData-Wert durch den gewünschten Wert zu ersetzen.

Daniel Moraes
quelle
1

In meinem Fall war es ein Satellitenbild, das ich in 8 Bit konvertieren musste, und es gab keine Datenwerte aus, wenn -scale in gdal_translate verwendet wurde.

Ich konnte das Problem lösen, indem ich das Raster (Ebene mit der rechten Maustaste -> Exportieren -> Ebene speichern unter ...) als gerenderte Daten in eine neue Datei exportierte (Kontrollkästchen oben im Dialogfenster).

bartek2101
quelle
0

Für Python-Skripte können Sie die folgende Zeile vor WriteArray verwenden.

maskband.SetNoDataValue(0)
Shiuli Pervin
quelle