GDAL栅格输出

7

我正在尝试使用Python中的GDAL创建一个.tif文件。它创建了一个文件,但是每当我浏览它时,都会显示“没有可用的预览”。目前,我只是想让它复制输入文件。以下是我的代码:

gdal.AllRegister()

inDs = gdal.Open("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\color_a2.tif")
if inDs is None:
  print 'Could not open image file'
  sys.exit(1)
else:
    print "successfully opened input file"

rows = inDs.RasterYSize
cols = inDs.RasterXSize
myband = inDs.GetRasterBand(1)
elev_data = myband.ReadAsArray(0,0,cols,rows)
driver = inDs.GetDriver()
outDs = driver.Create('C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\new.tif', cols, rows, 1, GDT_Int32)

if outDs is None:
    print "couldn't open output file"
    sys.exit(1)

outBand = outDs.GetRasterBand(1)
outData = numpy.zeros((rows,cols),numpy.int16)
outBand.WriteArray(elev_data)
outBand.FlushCache()
outBand.SetNoDataValue(-99)
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())
del outData

我做了一些发现...... 我研究了使用统计规范化将数字格式从一个转换为另一个的方法。我使用以下算法处理输入数据并将其转换为uint8:

std = elev_data.std() #standard dev
avg = elev_data.mean()
arr = numpy.zeros((rows,cols),numpy.uint8)
for _i_ in _range_(_rows_):
    for _j_ in _range_(_cols_):
        arr[i,j] = (((out_elev[i,j]-avg)/std)*127)+128 #normalization formula
        #this puts all vals in range 1 to 255 (uint8)
dr = gdal.GetDriverByName("GTiff")
outDs = dr.Create("name",cols,rows,3,GDT_Byte) 
#creates and RGB file, accepts uint8 for input
outDs.GetRasterBand(1).WriteArray(arr) #write the output as shades of red
#this writes out a format viewable by microsoft products

我想复制的主要原因是为了证明我能够读取,然后根据计算写出更新的数据。

有什么方法可以使用颜色渐变来输出数据,而不是只用一种颜色的阴影?

2个回答

2
您的意思是在尝试将TIFF文件预览为图像时,Windows图片和传真查看器应用程序显示“无预览可用”吗?(请参见下面的屏幕截图。)

No preview available screenshot

请记住,TIFF 有很多不同的变体,而且并非都相同。特别是,Windows 图片和传真查看器不支持所有种类的 TIFF。
有一篇微软知识库文章《您无法使用 Windows 图片和传真查看器查看 TIFF 图像》部分内容如下:
“Windows XP 中的 Windows 图片和传真查看器使用 Windows 图形设备接口 (GDI+)。GDI+ 支持许多标准的传真压缩算法。但是,它可能与某些不常用的编码方案不兼容。”
如果您正在寻找查看栅格数据(包括 GeoTIFF 栅格)的工具,我建议您使用免费提供的 OpenEV,您可以在 FWTools 包中获得它。

1

我注意到几件事情:

  1. 你只复制了源数据集的一个波段。如果它是一张彩色图像,可能有3个波段或者一个颜色映射。如果它有一个颜色映射,你也需要复制它。如果它有3或4个波段,你需要复制所有的数据。
  2. CreateCopy() 是实现你想要的功能更简单的方法。

1
我找到了问题所在 - 我没有适合我创建的输出文件类型的正确查看器。Microsoft产品不支持查看Int16。我下载并安装了Brava Reader,它能够查看我可以生成的大多数输出形式。 - Pat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接