Mehr

Schreibe python ndarray in raster


Ich glaube, ich habe die Schritte zum Schreiben eines Arrays in eine Rasterdatei mit Python verstanden. In meinem Fall funktioniert es jedoch nicht und ich weiß nicht warum. Ich habe ein Array, das ich mit Swiss Oblique Mercator Projection an einen Geotiff schreiben möchte. Ich habe ein DEM als Geotiff an genau derselben Stelle mit denselben Projektionen und Geotransformation, also dachte ich, ich lese einfach alle Parameter aus diesem DEM und verwende sie, um mein neues Raster zu schreiben. Hier ist der Code, den ich verwende:

driver.Register() fn = '/media/LACIE_SHARE/davos2015.tif' inDs = gdal.Open(fn) if inDs is None: print 'Konnte nicht öffnen' + fn sys.exit(1) rows=inDs.RasterYSize cols =inDs.RasterXSize driver=inDs.GetDriver() outDs=driver.Create('/home/grassdata/test.tif',cols,rows,1,gdal.GDT_Float32) if outDs is None: print "mist" sys.exit (1) outBand=outDs.GetRasterBand(1) outData=coh0 #coh0 ist das Array, das ich in ein Raster konvertieren möchte. Es ist ein Array mit float32-Einträgen. outBand.WriteArray(outData) # das ergibt 0 outBand.FlushCache() outBand.SetNoDataValue(-99) #das ergibt 0 outDs.SetGeoTransform(inDs.GetGeoTransform()) #das ergibt 0 outDs.SetProjection(inDs.GetProjection()) #das ergibt 0 del outData

die Zeilen, die ich kommentiert habe, erhöhen dementsprechend 0 als Ergebnis und ich verstehe nicht warum.


Ihr Problem hat seine Wurzeln in einem bekannten GDAL-Python-Gotcha - ein Datensatz muss geschlossen werden, damit er auf die Festplatte geschrieben werden kann.

In Python passiert dies, wenn das Objekt den Gültigkeitsbereich verlässt und von der Garbage Collection erfasst wird oder wenn Sie es manuell dereferenzieren. Dies geschieht normalerweise durch Einstellen aufKeineroder löschen.

In Ihrem speziellen Code befindet sich der Fehler in der letzten Zeile:del outDataschließt nur Ihr Kohärenz-Numpy-Array. Sie möchten schließenoutDsso wird es auf die Festplatte geschrieben.FlushCache()ist in Ihrem Fall nicht notwendig, da dies nur das Verhalten des Blockcaches beeinflusst, den GDAL intern handhabt.

Ihre letzten Zeilen sollten so aussehen:

outBand.WriteArray(coh0) outBand.SetNoDataValue(-99) outDs.SetGeoTransform(inDs.GetGeoTransform()) outDs.SetProjection(inDs.GetProjection()) outBand = None outDs = None

Zusätzliche Bemerkungen:

  • Wenn Sie eine Kopie eines bestehenden Datensatzes erstellen und ihn einfach mit neuen Daten füllen möchten, können Sie auch dieCreateCopy()-Methode, um einige Codezeilen zu speichern.
  • GDAL ist sehr mächtig und gleichzeitig sehr unpythonisch. rasterio ist eine alternative Möglichkeit, die GDAL-Bindungen viel pythonischer zu verwenden.


Schau das Video: Batch Processing of Raster Images using Iterate Raster ModelBuilder - ArcGIS (Oktober 2021).