RFC 58:删除数据集Nodata值

作者:肖恩·吉利斯

联系人:sean,邮箱:mapbox.com

状态:通过、实施

实现版本:2.1

总结

此RFC涉及添加 DeleteNoDataValue() 对C++ GDRARASTROUND API的函数。此函数用于删除栅格标注栏的nodata值。当它成功时,栅格波段将没有nodata值。当失败时,nodata值将保持不变。

理论基础

nodata值具有访问器 GetNoDataValue()SetNoDataValue() . 对于GeoTIFFs,该值存储在TIFF tag_GDAL_NODATA TIFF标记中。新创建的GeoTIFF文件可以没有nodata值(没有标记),但一旦设置并存储了nodata值,就只能为其提供新值,不能将其删除。也不能设置为数据类型范围之外的值;对于8位数据传递 nan-inf256GDALSetNoDataValue() 与传递0具有相同的效果。

不可移动nodata值的问题是:

  • Nodata masks(参见GDAL RFC 15)可以掩盖Nodata值,但如果.msk文件丢失(这是sidecar文件的问题),则隐藏的Nodata值将再次暴露。

  • 在GDAL中,Nodata掩码在任何地方都不可用,Nodata值是GDAL某些部分中有效数据的唯一定义。

删除nodata值的当前建议做法是使用gdal_translate复制GeoTIFF,指定nodata标记不与数据一起复制。通过使nodata值完全可编辑和可移动,我们可以避免不必要的复制。

变化

这个 virtual CPLErr DeleteNoDataValue() 方法将添加到GDALLIPRIV.H(C++ API)中的GDRARASTROP带方法,以及 CPLErr GDALDeleteRasterNoDataValue() 至gdal.h(C API)

更新的驱动程序

将更新以下驱动程序:GTiff、MEM、VRT和KEA。

对于GTiff,如果GDAL是根据libtiff 4.X构建的,那么TIFFTAGu GDALu NODATA TIFF标记是未设置的,这是适当的行为。对于不存在TIFFUnsetField()的libtiff 3.X,标记被设置为空字符串:GDAL 2.0将检测到缺少nodata值,旧版本将把它解析为0。

这个 GDALPamRasterBand 类也将被更新(对于没有内置机制nodata机制并且依赖于.aux.xml sidecars的驱动程序)。请注意,这只会从.aux.xml中删除标记,因此在驱动程序具有存储nodata的内部方式,但将以只读模式打开(因此默认为PAM)的情况下,DeleteNoData()将不起作用。

SWIG绑定(Python/Java/C#/Perl)更改

DeleteNoDataValue()方法被添加到RasterBand对象中。

公用事业

gdal_edit.py脚本通过-unsetnodata选项得到增强。

文档

新的方法和功能被记录在案。

测试套件

更新驱动程序的测试测试新方法的效果。

兼容性问题

C API没有。由于引入了一种新的虚拟方法,所以ABI改变了C++ API。

实施

实现将由Even Rouault完成,并由Mapbox赞助。

建议的实现可在 https://github.com/OSGeo/gdal/compare/trunk...rouault:rfc58_removing_nodata_value

投票历史

+1名来自Evner、HowardB、DanielM和JukkaR