【问题标题】:Filling nodata values in geotiff with data from another raster用来自另一个栅格的数据填充 geotiff 中的 nodata 值
【发布时间】:2018-01-31 10:20:35
【问题描述】:

我有两个不同分辨率的重叠光栅文件(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: invalid syntax。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python-2.7 raster gdal


    【解决方案1】:

    如果正确设置了 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 作为输出格式,您可以即时(在内存中)执行所有中间步骤。如果您想要输出,出于调试或其他目的,将文件名更改为磁盘上的位置可为您提供中间结果。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 2021-12-25
      • 2018-04-20
      • 2016-11-17
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多