RFC 75:多维数组

作者:

甚至鲁奥

联系方式:

even.rouault@spatialys.com网站

起动:

2019年5月24日

上次更新时间:

2019年7月22日

状态:

在GDAL3.1中实现

总结

本文档描述了在GDAL核心和一些精选的驱动程序中添加对多维数组(特别是维度3或更高)的读/写支持。

动机

多维阵列(也称为超立方体)是一种时空(二维栅格的时间序列)或空间垂直时间(二维+Z维+时间维)数据的建模方法,其可用性越来越高。然而,GDAL当前的栅格模型是面向二维的。许多驱动程序,如netCDF、HDF4、HDF5,通过使用栅格带或子数据集公开本质上是N>2多维数据集的多个2D切片来解决这一限制。最好有一个适当的API和驱动程序支持,以便能够公开这些多维数组,并能够对它们执行切片和修剪操作。

过去已经讨论过这个问题,特别是 mailing list thread

提议的变更

许多现有的GDAL栅格API都是面向二维的。我们建议添加一个新的专用API来支持多维数组,而不是升级所有这些API和驱动程序代码,以便为N个任意维度做好准备,这对于只有一小部分驱动程序的好处来说是一项巨大的工作。我们还希望支持在 HDF5 format and data model . 此模型可以包含具有多维功能的其他格式/驱动程序的需求,如HDF4、netCDF、GRIB、WCS。因此,提议的API将受到HDF5库本身的API的强烈启发。

数据模型

数据模型描述见:https://github.com/rouault/gdal/blob/rfc75/gdal/doc/source/user/multidim_raster_data_model.rst

C++ API

将添加新的类和方法。请参阅https://github.com/rouault/gdal/blob/rfc75/gdal/gcore/gdalúu priv.h#L1715

将为支持多维栅格的驱动程序添加新的驱动程序功能:

#define GDAL_DCAP_MULTIDIM_RASTER     "DCAP_MULTIDIM_RASTER"

新的开放旗帜, GDAL_OF_MULTIDIM_RASTER ,为了 GDALOpenEx() 将被添加。指定此选项后,支持多维栅格的驱动程序将返回根GDALGroup。否则他们目前的传统二维模式仍将被使用。

新的创建选项元数据项将添加到文档多维数据集、组、维度、数组和属性创建选项。

/** XML snippet with multidimensional dataset creation options.
* @since GDAL 3.1
*/
#define GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST "DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST"

/** XML snippet with multidimensional group creation options.
* @since GDAL 3.1
*/
#define GDAL_DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST "DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST"

/** XML snippet with multidimensional dimension creation options.
* @since GDAL 3.1
*/
#define GDAL_DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST "DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST"

/** XML snippet with multidimensional array creation options.
* @since GDAL 3.1
*/
#define GDAL_DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST "DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST"

/** XML snippet with multidimensional attribute creation options.
* @since GDAL 3.1
*/
#define GDAL_DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST "DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST"

netCDF驱动程序示例:

<MultiDimDatasetCreationOptionList>
<Option name="FORMAT" type="string-select" default="NC4">
    <Value>NC</Value>
    <Value>NC2</Value>
    <Value>NC4</Value>
    <Value>NC4C</Value>
</Option>
<Option name="CONVENTIONS" type="string" default="CF-1.6" description="Value of the Conventions attribute" />
</MultiDimDatasetCreationOptionList>


<MultiDimDimensionCreationOptionList>
<Option name="UNLIMITED" type="boolean" description="Whether the dimension should be unlimited" default="false" />
</MultiDimDimensionCreationOptionList>


<MultiDimArrayCreationOptionList>
<Option name="BLOCKSIZE" type="int" description="Block size in pixels" />
<Option name="COMPRESS" type="string-select" default="NONE">
    <Value>NONE</Value>
    <Value>DEFLATE</Value>
</Option>
<Option name="ZLEVEL" type="int" description="DEFLATE compression level 1-9" default="1" />
<Option name="NC_TYPE" type="string-select" default="netCDF data type">
    <Value>AUTO</Value>
    <Value>NC_BYTE</Value>
    <Value>NC_INT64</Value>
    <Value>NC_UINT64</Value>
</Option>
</MultiDimArrayCreationOptionList>


<MultiDimAttributeCreationOptionList>
<Option name="NC_TYPE" type="string-select" default="netCDF data type">
    <Value>AUTO</Value>
    <Value>NC_BYTE</Value>
    <Value>NC_CHAR</Value>
    <Value>NC_INT64</Value>
    <Value>NC_UINT64</Value>
</Option>
</MultiDimAttributeCreationOptionList>

计算机辅助编程接口

所有C++方法都映射到C API。见https://github.com/rouault/gdal/blob/rfc75/gdal/gcore/gdal.h#L1397

驱动程序更改

  • MEM驱动程序将实现读写支持。

  • VRT驱动程序将允许从多维驱动程序提取二维切片到二维/经典驱动程序,以及多维->多维切片/修剪

  • netCDF驱动程序将实现读写支持。

  • HDF4和HDF5驱动程序将实现读取支持。

  • GRIB驱动程序将实现读支持(只为时间戳不同的GRIB消息公开X、Y、时间数组)

系统管理工具

  • 添加了一个新的gdalmdiminfo实用程序来报告层次结构和内容。其输出格式为JSON。有关文档,请参见https://github.com/rouault/gdal/blob/rfc75/gdal/doc/source/programs/gdalmdiminfo.rst。

  • 添加了一个新的gdalmdimtranslate实用程序,用于在不同格式之间转换多维栅格,和/或可以执行特定数组和组的选择性转换和/或子集操作。它还可以从多维驱动程序中提取二维切片到二维/经典驱动程序。有关文档,请参见https://github.com/rouault/gdal/blob/rfc75/gdal/doc/source/programs/gdalmdimtranslate.rst。

SWIG绑定更改

C API被映射到SWIG绑定。Python绑定的作用域已完成。其他语言需要添加缺少的类型映射,但这不在本RFC的工作范围内。对于Python绑定,完成了NumPy集成。

局限性

这是关于这一主题的初步工作。虽然目标是使其可用于定义的范围,但它可能需要将来的增强来填补功能和/或性能差距。

  • 没有块缓存机制(不确定是否需要此机制)

  • 无子像素请求或非最近的子采样

  • 升级WCS驱动程序或其他具有潜在多维功能的驱动程序不属于本RFC的一部分。

  • SWIG绑定:仅适用于Python绑定的全范围。

向后兼容性

没有向后不兼容。只添加了API和实用程序。

文档

测试

gdalautotest套件被扩展以测试修改后的驱动程序和新的实用程序。

实施

甚至鲁奥也会执行。初步实现可在https://github.com/OSGeo/gdal/pull/1704上获得

投票历史

+1名来自霍华德、诺曼布和埃文