Python'da GDAL ile bir geotiff okuma, değiştirme ve yazma


11

Python GDAL bağları ve numpy kullanarak Uzaktan Algılama görüntü işlemenin iplerini öğrenmeye çalışıyorum. İlk denemede, Landsat8 geotiff dosyasını okuyorum, basit bir manipülasyon yapıyorum ve sonucu yeni bir dosyaya yazıyorum. Aşağıdaki kod, orijinal rasterin manipüle edilmiş raster yerine çıktı dosyasına dökülmesi dışında iyi çalışıyor gibi görünüyor.

Herhangi bir yorum veya öneri kabul edilir, ancak özellikle manipüle edilen rasterin sonuçta neden görünmediğine dair notlar.

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

Windows 7 32 bit makinede Python 2.7.1 kullanıyorum.


Bir DEM (Ubuntu, python 2.7.1) üzerinde çalışmayı başardım ve ortalama değerin altındaki her şey 10000'e ayarlanmış ve yeni bir tiff'e yazılan beklenen sonucu üretti. Geotransform'u yeni görüntüye kopyalamıyorsunuz, bu yüzden yansıtılmıyor, bu yüzden görüntülemeye çalışırken bunu hesaba katmanız gerekebilir (bunu yapmak için bir astar var, ancak kazmam gerekecek). Sorunuzu düzenleyebiliyorsanız gdainfo -stats original.tiffve gelen ve gdal-config --versionbu da yardımcı olabilir.
Steven Kay

Merhaba, bunu incelediğiniz için teşekkürler! Daha sonra çiğnemeyi düşündüğüm jeotransformu ihmal ettiğimi biliyorum. Ben tüm çıktı görüntüsünü görüyorum (Irfanview kullanarak), bu yüzden bu olamaz sanırım. Bu gece tekrar oturduğumda istediğin bilgileri üreteceğim.
Hans Roelofsen

Merhaba, sorduğun bilgileri vermek için uğraşıyorum. Python GDAL bağlama kullanıyorum ve belirttiğiniz komutların bir Python komutuna nasıl karşılık geldiğinden emin değilim. Her durumda, buradan edinildiği gibi GDAL-1.11.2-cp27-none-win32 kullanıyorum . Yazımı orijinal .tiff'deki bazı istatistiklerle güncelleyeceğim.
Hans Roelofsen

arr_min ne olurdu?
fluidmotion

arr_min = 0. Bunu göstermek için yayını güncelledim. Teşekkürler!
Hans Roelofsen

Yanıtlar:


13

Komut dosyanızda, değişikliklerin sonunda belleğe sahip olduklarınızı diske kaydeden ds.FlushCache yöntemi eksik. Aşağıda örneğinizin düzeltilmiş bir sürümüne bakın. Projeksiyon ve geotransform'u girdi olarak ayarlamak için iki satır eklediğime dikkat edin

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

Dış yüzey yansıtılmaz. Bir HDF5 dosyası okuyorum ve dışa aktarmak istediğim banttan izdüşümü seçiyorum GetProjection(), doğru EPSG sağlıyor, ancak uygulanmıyor gibi görünüyor. GDAL çözgü eksik mi? Teşekkürler!
Michael

outdata.GetRasterBand(1).WriteArray(arr_out)Birden fazla bandı olan çokbantlı bir görüntü yazmak için neyle değiştirmeliyim ?
Sai Kiran

Driver.Create () içindeki "1" bant sayısını belirtir. Daha sonra outdata.GetRasterBand (band_number) ile her banda yazabilirsiniz. Sıfırdan değil 1'den başlar.
Andrea Massetti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.