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各一家