GDAL 栅格输出

7 投票
2 回答
3952 浏览
提问于 2025-04-16 21:37

我正在尝试用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 个回答

1

我注意到几点:

  1. 你只复制了源数据集中一部分。如果这是张彩色图片,它可能有3个颜色通道,或者有一个颜色映射。如果有颜色映射,你也需要把它复制过来。如果有3个或4个通道,你就得把所有的数据都复制过来。
  2. CreateCopy() 是一个更简单的方法,可以帮你完成你想做的事情。
2

你是说在用Windows的图片和传真查看器预览TIFF文件时,看到“没有可用的预览”这个提示吗?(见下面的截图。)

没有可用的预览截图

要知道,TIFF格式有很多种不同的类型,并不是所有的TIFF文件都是一样的。特别是,Windows的图片和传真查看器并不支持所有类型的TIFF文件。

微软有一篇知识库文章,标题是“你无法使用Windows图片和传真查看器查看TIFF图像”,其中提到:

Windows XP中的图片和传真查看器使用的是Windows图形设备接口(GDI+)。GDI+支持许多标准的传真压缩算法,但可能与一些不常用的编码方式不兼容。

如果你在找可以查看光栅数据(包括GeoTIFF光栅)的工具,我推荐一个免费的软件OpenEV,它可以作为FWTools包的一部分下载。

撰写回答