Mehr

-9999 (kein Datenwert) wird 0 beim Schreiben des Arrays in die GDAL-Speicherdatei


Ich versuche, ein Rasterbild (Form 238X406) mit der Funktion gdal.ReprojectImage() in Python neu zu projizieren und neu zu berechnen (1000m ->> 30m). Die Eingabedatei hat -9999 Zellen als keinen Datenwert. Das Ergebnis ist ein Array (Form 10834x15055). Der Datentyp ist float32.

Wenn ich das Ergebnis in eine Geotiff-Datei schreibe, wird alles erwartet. Kein Datenwert wird auf -9999 gesetzt und das Ausgabearray hat -9999 Zellen. Wenn ich jedoch das Ergebnis in eine gdal-Speicherdatei schreibe, um etwas Zeit zu sparen (25 Sekunden kürzere Verarbeitungszeit, von 105 Sekunden auf 80 Sekunden), werden diesmal alle -9999s (kein Datenwert) in der Ausgabe zu 0 (Null). Array der Speicherdatei. Beide Ergebnisse sind genau gleich, aber die GeoTIFF-Datei hat -9999, die Speicherdatei hat 0. Obwohl die Speicherdatei keinen Datenwert von -9999 hat, wird das Ausgabearray jedoch auf 0.0 statt auf -9999 initialisiert.

Ich verwende den gleichen Code, um die Ergebnisse zu erzeugen, und der einzige Unterschied besteht darin, dass ich den Speichertreiber aufrufe, wenn ich das Ergebnis in die Speicherdatei schreiben möchte (driver=gdal.GetDriverByName("MEM")) und den GeoTIFF-Treiber, wenn ich schreiben möchte Ergebnis in GeoTIFF-Datei (driver=gdal.GetDriverByName("GTiff"))

Meine gdal-Version ist '1100000' von gdal.VersionInfo(). Mein Betriebssystem ist ubuntu 12.04 LTS "präzise".

# Eine Datei erstellen outFileRead=driver.Create(outFilePath,X,Y,1,dataType,options) print inFileRead.GetRasterBand(1).GetNoDataValue() print inFileRead.GetRasterBand(1).ReadAsArray() print inFileRead.GetRasterBand(1 ).ReadAsArray().shape # Reprojektieren gdal.ReprojectImage(inFileRead,outFileRead,inProjection,outProjection,reSamplingType) print outFileRead.GetRasterBand(1).GetNoDataValue() print outFileRead.GetRasterBand(1).ReadAsArray() printFileRead.GetRasterBand( 1).ReadAsArray().shape

das Ergebnis der Drucke

-9999.0

[[-9999. -9999. -9999… , -9999. -9999. -9999.]

[-9999. -9999. -9999… , -9999. -9999. -9999.]

[-9999. -9999. -9999… , -9999. -9999. -9999.]

… ,

[-9999. -9999. -9999… , -9999. -9999. -9999.]

[-9999. -9999. -9999… , -9999. -9999. -9999.]

[-9999. -9999. -9999… , -9999. -9999. -9999.]]

(406, 238)

-9999.0

[[ 0. 0. 0… , 0. 0. 0.]

[ 0. 0. 0… , 0. 0. 0.]

[ 0. 0. 0… , 0. 0. 0.]

… ,

[ 0. 0. 0… , 0. 0. 0.]

[ 0. 0. 0… , 0. 0. 0.]

[ 0. 0. 0… , 0. 0. 0.]]

(15055, 10834)

Dies wird angezeigt, selbst wenn kein Datenwert in der Speicherdatei auf -9999 gesetzt ist, wird das Array auf 0.0 statt auf keinen Datenwert initialisiert. Array in GeoTIFF wird wie erwartet auf keinen Datenwert, -9999, initialisiert. Ich denke, das ist ein Fehler in der Speicherdatei.


Laut Quellcode ist dies ein Problem, das in GDAL 2.0 behoben wurde. Unabhängig davon, ob dies der Fall ist oder nicht, können Sie es umgehen, indem Sie das neue Raster mit Ihrem bevorzugten nodata-Wert vorab ausfüllen:

outFileRead=driver.Create(outFilePath,X,Y,1,dataType,options) tmp = gdal.AutoCreateWarpedVRT(outFileRead, src_wkt, dst_wkt) b = outFileRead.GetRasterBand(1) b.SetNoDataValue(-9999) a = np.ndarray (shape=(tmp.RasterYSize, tmp.RasterXSize)) a.fill(-9999.0) b.WriteArray(a) gdal.ReprojectImage(inFileRead,outFileRead,inProjection,outProjection,reSamplingType)

Bandband = outAlignedRaster.GetRasterBand(1); band.SetNoDataValue(-9999.9); band.Füllen (-9999.9, 0.0); Gdal.ReprojectImage(… );

Ich habe den Bandfüllwert genau so verwendet wie kein Datenwert in meiner .net-Anwendung und es hat für mich funktioniert.


Das Problem liegt beim gdal-Speichertreiber, nicht beim Reprojizieren der Funktion. Der Gdal-Speichertreiber initialisiert das Array immer mit Nullen anstelle von keinem Datenwert, selbst wenn kein Datenwert explizit festgelegt wurde. Siehe das Beispiel unten. Beim Reprojektieren wird das Ausgabe-Array mit 0 initialisiert, wenn das reprojizierte Array in dieses Array geschrieben wird, bleiben die überzähligen Elemente 0 statt keinen Datenwert. Das Array sollte ohne Datenwert initialisiert werden (nur wenn es gesetzt ist).

from osgeo import gdal, gdal_array import numpy ds = gdal.GetDriverByName('MEM').Create(", 3, 3, 1, gdal.GDT_Float32) ds.GetRasterBand(1).SetNoDataValue(-9999.0) ar = numpy.array ([[-9999.0]], dtype = numpy.float32) ds.GetRasterBand(1).WriteArray(ar) print(ds.GetRasterBand(1).ReadAsArray()) [[-9999. 0. 0.] [ 0 . 0. 0.] [ 0. 0. 0.]]

https://trac.osgeo.org/gdal/ticket/6404