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
, -inf
或 256
到 GDALSetNoDataValue()
与传递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