在python中使用GDAL读取,修改和编写Geotiff


11

我正在尝试学习使用Python GDAL绑定和numpy进行遥感图像处理的绳索。作为首次尝试,我正在读取Landsat8 geotiff文件,进行简单的操作并将结果写入新文件。下面的代码看起来工作正常,除了原始栅格转储在输出文件中,而不是转储在操纵的栅格中。

欢迎提出任何意见或建议,但要特别注意为何未在结果中显示操纵的栅格。

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位计算机上使用Python 2.7.1。


我将其用于DEM(Ubuntu,python 2.7.1)上,它产生了预期的结果,所有低于平均值的值都设置为10000并写入了新的tiff。您没有将geotransform复制到新图像上,因此它是未投影的,因此在尝试查看它时可能需要将其考虑在内(有一种方法可以做到这一点,但我需要对其进行挖掘)。如果你可以从输出编辑您的问题gdainfo -stats original.tiff,并gdal-config --version也可能会有所帮助。
史蒂文·凯

嗨,谢谢您的关注!我知道我忽略了地理转换,后来想再考虑一下。我确实看到了整个输出图像(使用Irfanview),所以我认为不可能。今晚回到座位上时,我会生成您要求的信息。
汉斯·罗洛夫森

嗨,我正在努力提供您要求的信息。我正在使用Python GDAL绑定,并且不确定您指定的命令如何对应于Python命令。无论如何,我都使用GDAL-1.11.2-cp27-none-win32(从此处获取)。我将使用原始.tiff上的一些统计信息更新我的帖子。
汉斯·罗洛夫森

arr_min是什么?
Fluidmotion

arr_min =0。我更新了帖子以显示此内容。谢谢!
汉斯·罗洛夫森

Answers:


13

您的脚本缺少ds.FlushCache方法,该方法将在修改结束时将内存中的内容保存到磁盘。参见下面示例的更正版本。请注意,我还添加了两行来设置投影和geotransform作为输入

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

没有计划输出文件。我正在读取HDF5文件,并从要导出的波段中选择投影以GetProjection()提供正确的EPSG,但似乎没有应用。GDAL经线丢失了吗?谢谢!
迈克尔(Michael)

我应该用什么替换outdata.GetRasterBand(1).WriteArray(arr_out)才能写出具有多个波段的多光谱图像?
Sai Kiran

driver.Create()中的“ 1”表示频段数。然后,您可以使用outdata.GetRasterBand(band_number)在每个波段上写入。它从1开始,而不是零。
Andrea Massetti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.