使用来自另一个栅格的数据填充geotiff中的nodata值

时间:2018-01-31 10:20:35

标签: python-2.7 raster gdal

我有两个不同分辨率的重叠光栅文件(A = 25m,B = 5m)。我想用最快最有效的方式用A中的值填充B(-999)中的nodata值(如果可能的话,使用python绑定进行自动化)。

我测试了不同的方法:

  1. 使用gdalwarp将光栅A重新采样到B的分辨率,然后使用gdal_calc进行公式gdal_calc.py -A MNT_5m.tif -B BATI_5m.tif --outfile=out.tif --calc="maximum(A,B)"但是没有做任何事情,重新采样是一项耗时的操作。
  2. 再次使用gdal_calc和计算公式--calc="A*(B=-999)+B*(B!=-999)",但这会给我以下错误:SyntaxError:语法无效。
  3. 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果正确设置了nodata值(在元数据中),使用gdal.BuildVRT可能是一个很好的方法。

BuildVRT允许分辨率差异,因此您可以跳过扭曲步骤。但是对于所有文件,投影必须相同。

命令中第一个列出的文件最终“在顶部”,因此应该是您的5m文件,然后是25m文件。

import gdal

dsvrt = gdal.BuildVRT('output.vrt', ['MNT_5m.tif', 'BATI_25m.tif'],
                      resolution='highest', resampleAlg=gdal.GRA_Bilinear)

如果输出的VRT文件不足,您可以轻松使用Translate转入TIFF或其他内容:

dstif = gdal.Translate('output.tif', dsvrt)

dsvrt = None
dstif = None

如果确实需要使用gdal.Warp,可以在gdal.BuildVRT之前添加它,并将返回的Dataset传递给BuildVRT(而不是文件名作为字符串)。

这种工作方式的好处是您可以轻松地在输出中间文件之间切换。通过使用/vsimem/tempfile作为输出,使用VRT作为输出格式,您可以在运行中(内存中)执行所有中间步骤。如果您想要输出,出于调试或其他目的,将文件名更改为磁盘上的位置可以获得中间结果。