Lesen, Ändern und Schreiben eines Geotiffs mit GDAL in Python


11

Ich versuche, die Seile der Fernerkundungs-Bildverarbeitung mit Python GDAL-Bindungen und Numpy zu lernen. Als ersten Versuch lese ich eine Landsat8-Geotiff-Datei, führe eine einfache Manipulation durch und schreibe das Ergebnis in eine neue Datei. Der folgende Code scheint einwandfrei zu funktionieren, außer dass das ursprüngliche Raster in der Ausgabedatei und nicht im manipulierten Raster gespeichert wird.

Kommentare oder Vorschläge sind willkommen, insbesondere aber Hinweise, warum das manipulierte Raster im Ergebnis nicht angezeigt wird.

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Ich verwende Python 2.7.1 auf einem Windows 7 32-Bit-Computer.


Ich habe es auf einem DEM (Ubuntu, Python 2.7.1) zum Laufen gebracht und es hat das erwartete Ergebnis erzielt, wobei alles unter dem Mittelwert auf 10000 gesetzt und auf einen neuen TIFF geschrieben wurde. Sie kopieren die Geotransformation nicht auf das neue Bild, sodass es nicht projiziert wird. Daher müssen Sie dies möglicherweise berücksichtigen, wenn Sie versuchen, es anzuzeigen (es gibt einen Einzeiler, um dies zu tun, aber ich muss es ausgraben). Wenn Sie Ihre Frage mit der Ausgabe von gdainfo -stats original.tiffund gdal-config --versionauch bearbeiten können , könnte dies helfen.
Steven Kay

Hallo, danke, dass du dir das angeschaut hast! Ich weiß, dass ich die Geotransformation vernachlässigt habe und dachte daran, später daran zu kauen. Ich sehe allerdings das gesamte Ausgabebild (mit Irfanview), also kann das nicht sein, denke ich. Ich werde die von Ihnen angeforderten Informationen generieren, wenn ich heute Abend wieder auf dem Platz bin.
HDR

Hallo, ich habe Probleme, die von Ihnen angeforderten Informationen bereitzustellen. Ich verwende die Python GDAL-Bindung und bin mir nicht sicher, wie die von Ihnen angegebenen Befehle einem Python-Befehl entsprechen. In jedem Fall verwende ich GDAL-1.11.2-cp27-none-win32, wie von hier erworben . Ich werde meinen Beitrag mit einigen Statistiken auf der ursprünglichen .tiff aktualisieren.
HDR

was wäre arr_min?
Fluidmotion

arr_min = 0. Ich habe den Beitrag aktualisiert, um dies zu zeigen. Vielen Dank!
HDR

Antworten:


13

In Ihrem Skript fehlt die Methode ds.FlushCache, mit der gespeichert wird, was Sie am Ende der Änderungen im Speicher haben. Unten sehen Sie eine korrigierte Version Ihres Beispiels. Beachten Sie, dass ich auch zwei Zeilen hinzugefügt habe, um Projektion und Geotransform als Eingabe festzulegen

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

Das Outfile wird nicht projiziert. Ich lese eine HDF5-Datei und wähle die Projektion aus dem Band aus, das ich exportieren möchte. Sie GetProjection()liefert das richtige EPSG, aber es scheint nicht angewendet zu werden. GDAL Warp fehlt? Vielen Dank!
Michael
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.