RFC 57:直方图的64位桶计数

作者:连鲁奥

联系人:spatialys.com上的偶数点rouault

状态:通过、实施

版本:2.0

总结

此RFC修改gdalStartBand GetHistogram()、GetDefaultHistogram()和SetDefaultHistogram()方法以接受64位整数数组,而不是当前32位整数数组作为存储桶计数。它还将GetRasterSampleOverview()更改为采用64位整数。这将解决在超过20亿像素的大型栅格上操作时的问题。

核心变化

下面的GDALRasterBand类方法被修改为使用GUIntBig * GetHistogram()和SetDefaultHistograph()的参数,GUIntBig ** 用于GetDefaultHistogram()和用于GetRasterSampleOverview()的GUIntBig

virtual CPLErr  GetHistogram( double dfMin, double dfMax,
                      int nBuckets, GUIntBig * panHistogram,
                      int bIncludeOutOfRange, int bApproxOK,
                      GDALProgressFunc, void *pProgressData );

virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
                                    int *pnBuckets, GUIntBig ** ppanHistogram,
                                    int bForce,
                                    GDALProgressFunc, void *pProgressData);

virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
                                    int nBuckets, GUIntBig *panHistogram );

virtual GDALRasterBand *GetRasterSampleOverview( GUIntBig );

PAM序列化/反序列化也会更新。

C API更改

仅添加:

CPLErr CPL_DLL CPL_STDCALL GDALGetRasterHistogramEx( GDALRasterBandH hBand,
                                       double dfMin, double dfMax,
                                       int nBuckets, GUIntBig *panHistogram,
                                       int bIncludeOutOfRange, int bApproxOK,
                                       GDALProgressFunc pfnProgress,
                                       void * pProgressData );

CPLErr CPL_DLL CPL_STDCALL GDALGetDefaultHistogramEx( GDALRasterBandH hBand,
                                       double *pdfMin, double *pdfMax,
                                       int *pnBuckets, GUIntBig **ppanHistogram,
                                       int bForce,
                                       GDALProgressFunc pfnProgress,
                                       void * pProgressData );

CPLErr CPL_DLL CPL_STDCALL GDALSetDefaultHistogramEx( GDALRasterBandH hBand,
                                       double dfMin, double dfMax,
                                       int nBuckets, GUIntBig *panHistogram );

GDALRasterBandH CPL_DLL CPL_STDCALL
                           GDALGetRasterSampleOverviewEx( GDALRasterBandH, GUIntBig );

现有方法gdalGetStartHistogram()、GDALGetDefaultHistogram()和GDALSetDefaultHistogram()被标记为已弃用。它们在内部调用64位方法,对于gdalGetStartHistogram()和GDALGetDefaultHistogram(),如果发生32位溢出,则发出警告,在这种情况下,bucket count设置为INT_MAX。

驱动因素的变化

使用/实现C++直方图方法的所有IN树驱动程序都被修改:ECW、VRT、MEM和HFA。

公用设施的变化

对gdalinfo和gdalenance进行了修改,以使用修改后的方法。

SWIG绑定的更改

仅对于Python绑定,RasterBand.GetHistogram()、GetDefaultHistogram()和SetDefaultHistogram()使用新的64位C函数。

其他绑定可能会被更新,但可能需要(int,GUIntBig*)的新类型映射。同时,他们仍然使用32位C函数。

兼容性

这将修改C++ API和ABI。

树外的驱动程序必须确保考虑到更新的C++ API,如果它们实现了4个修改的虚拟方法中的一些。

文档

所有新的/修改的方法/功能都记录在案。MIGRATION_GUIDE.TXT将更新为此RFC的新部分。

测试

在gcore/pam.y和gdrivers/mem.py中测试设置/获取64位值

实施

实施将由甚至鲁奥完成 (Spatialys ②)

建议的实现位于 https://github.com/rouault/gdal2/tree/histogram_64bit_count .

更改列表: https://github.com/rouault/gdal2/compare/histogram_64bit_count

投票历史

+DanielM、JukkaR和Ever各一家