RFC 59:GDAL/OGR实用程序作为库

作者:法扎·马哈茂德

联系人:gmail.com上的fazamhd

状态:撤回以支持 RFC 59.1:GDAL/OGR实用程序作为库

总结

此RFC为每个GDAL实用程序定义新函数。新的实用程序函数可用于处理内存中的数据集。修改实用程序代码以调用新函数。这个RFC给出了一个通用的框架和原则,用gdalinfo进行了演示,但旨在与其他实用程序一起扩展。

理论基础

需要从代码中调用GDAL实用程序。但这涉及到使用系统调用,无法处理内存中的数据集。

变化

创建了新的库libgdolutions。Unix和Windows版本都已修改以考虑新的lib。GDAL实用程序被修改为使用新函数。将创建新的头文件gdal_utils.h,其中包含gdal实用程序的公共声明。可以找到当前标题(仍在进行中) here .

char CPL_DLL *GDALInfo( GDALDatasetH hDataset, GDALInfoOptions *psOptions );

GDALInfoOptions CPL_DLL *GDALInfoOptionsNew( void );

void CPL_DLL GDALInfoOptionsAddExtraMDDomains( GDALInfoOptions *psOptions,
                                               const char *pszDomain );

void CPL_DLL GDALInfoOptionsSetExtraMDDomains( GDALInfoOptions *psOptions,
                                               char **papszExtraMDDomains );

void CPL_DLL GDALInfoOptionsFree( GDALInfoOptions *psOptions );
GDALDatasetH CPL_DLL GDALTranslate(const char *pszDest, GDALDatasetH hSrcDataset, GDALTranslateOptions *psOptions, int *pbUsageError)

GDALDatasetH CPL_DLL GDALWarp( const char *pszDest, GDALDatasetH hDstDS, int nSrcCount,
                       GDALDatasetH *pahSrcDS, GDALWarpAppOptions *psOptions, int *pbUsageError )

GDALDatasetH CPL_DLL OGR2OGR( const char *pszDest, GDALDatasetH hDstDS, GDALDatasetH hSrcDS,
                              OGR2OGROptions *psOptions, int *pbUsageError )

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

仅对于Python绑定,在gdal模块中添加新函数Info()、Translate()和Warp(),该模块分别使用新的GDALInfo()、gdaltransate()和GDALWarp()函数。Translate()被添加到使用新OGR2OGR()函数的ogr模块中。

Info()可以用于设置gdal.InfoOptions()的属性或gdal.Info()的内联参数。

options = gdal.InfoOptions()

options.format = gdal.INFO_FORMAT_TEXT
options.deserialize = True
options.computeMinMax = False
options.reportHistograms = False
options.reportProj4 = True
options.stats = False
options.approxStats = True
options.sample = False
options.computeChecksum = False
options.showGCPs = True
options.showMetadata = True
options.showRAT = False
options.showColorTable = True
options.listMDD = False
options.showFileList = True
options.allMetadata = TRUE
options.extraMDDomains = ['TRE']

gdal.Info(ds, options, deserialize = True)
gdal.Info(ds, options = None, format = _gdal.INFO_FORMAT_TEXT, deserialize = True,
         computeMinMax = False, reportHistograms = False, reportProj4 = False,
         stats = False, approxStats = True, sample = False, computeChecksum = False,
         showGCPs = True, showMetadata = True, showRAT = True, showColorTable = True,
         listMDD = False, showFileList = True, allMetadata = False,
         extraMDDomains = None)

gdal.Translate(destName, srcDS, options = None, format = 'GTiff', quiet = True,
         outputType = GDT_Unknown, maskMode = _gdal.MASK_AUTO, bandList = None,
         oXSizePixel = 0, oYSizePixel = 0, oXSizePct = 0.0, oYSizePct = 0.0,
         createOptions = None, srcWin = [0,0,0,0],strict = False,
         unscale = False, scaleParams = None, exponent = None,
         uLX = 0.0, uLY = 0.0, lRX = 0.0, lRY = 0.0, metadataOptions = None,
         outputSRS = None, GCPs = None, ULLR = [0,0,0,0], setNoData = False,
         unsetNoData = False, noDataReal = 0.0, rgbExpand = 0, maskBand = 0,
         stats = False, approxStats = False, errorOnPartiallyOutside = False,
         errorOnCompletelyOutside = False, noRAT = False, resampling = None,
         xRes = 0.0, yRes = 0.0, projSRS = None)

gdal.Warp(destNameOrDestDS, srcDSOrSrcDSTab, options = None, minX = 0.0, minY = 0.0, maxX = 0.0,
         maxY = 0.0, xRes = 0.0, yRes = 0.0, targetAlignedPixels = False, forcePixels = 0,
         forceLines = 0, quiet = True, enableDstAlpha = False, enableSrcAlpha = False,
         format = 'GTiff', createOutput = False, warpOptions = None, errorThreshold = -1,
         warpMemoryLimit = 0.0, createOptions = None, outputType = GDT_Unknown,
         workingType = GDT_Unknown, resampleAlg = GRA_NearestNeighbour,
         srcNodata = None, dstNodata = None, multi = False, TO = None, cutlineDSName = None,
         cLayer = None, cWHERE = None, cSQL = None, cropToCutline = False, overwrite = False,
         copyMetadata = True, copyBandInfo = True, MDConflictValue = '*',
         setColorInterpretation = False, destOpenOptions = None, OvLevel = -2)

ogr.Translate(destNameOrDestDS, srcDS, options = None, accessMode = _ogr.ACCESS_CREATION,
         skipFailures = False, layerTransaction = -1, forceTransaction = False,
         groupTransactions = 20000, FIDToFetch = -1, quiet = False,
         format = 'ESRI Shapefile', layers = None, DSCO = None, LCO = None, transform = False,
         addMissingFields = False, outputSRSDef = None, sourceSRSDef = None,
         nullifyOutputSRS = False, exactFieldNameMatch = True, newLayerName = None,
         WHERE = None, geomField = None, selFields = None, SQLStatement = None,
         dialect = None, gType = -2, geomConversion = _ogr.GEOMTYPE_DEFAULT, geomOp = _ogr.GEOMOP_NONE,
         geomOpParam = 0, fieldTypesToString = None, mapFieldType = None, unsetFieldWidth = False,
         displayProgress = False, wrapDateline = False, dateLineOffset = 10, clipSrc = None, clipSrcDS = None,
         clipSrcSQL = None, clipSrcLayer = None, clipSrcWhere = None, clipDst = None,
         clipDstDS = None, clipDstSQL = None, clipDstLayer = None, clipDstWhere = None,
         splitListFields = False, maxSplitListSubFields = -1, explodeCollections = False,
         zField = None, fieldMap = None, coordDim = -1, destOpenOptions = None,
         forceNullable = False, unsetDefault = False, unsetFid = False, preserveFID = False,
         copyMD = True, metadataOptions = None, spatSRSDef = None, transformOrder = 0,
         spatialFilter = None)

公用事业

修改实用程序以调用相应的函数。

文档

所有新的方法/功能都记录在案。

测试套件

在test-gdal Info-lib.py中测试了gdal.Info方法。在test-gdal-Translate-lib.py中测试了gdal.Translate方法。gdal.Warp方法在test_gdalwarp_lib.py中进行了测试。Translate方法在test_ogr2ogr_lib.py中进行了测试。

兼容性问题

不需要。命令行实用程序将保持相同的接口。通过确保其在自动测试/实用程序中的测试仍然通过,将对其进行检查。

悬而未决的问题

类库化的ogr2ogr应该取什么名字?OGR2OGR()或OGRTranslate()?

GDALTranslate()、GDALWarp()和OGR2OGR()中的参数顺序当前为dest-then-source。

GDALDatasetH CPL_DLL GDALTranslate(const char *pszDest, GDALDatasetH hSrcDataset, GDALTranslateOptions *psOptions, int *pbUsageError)

GDALDatasetH CPL_DLL GDALWarp( const char *pszDest, GDALDatasetH hDstDS, int nSrcCount,
                       GDALDatasetH *pahSrcDS, GDALWarpAppOptions *psOptions, int *pbUsageError )

GDALDatasetH CPL_DLL OGR2OGR( const char *pszDest, GDALDatasetH hDstDS, GDALDatasetH hSrcDS,
                              OGR2OGROptions *psOptions, int *pbUsageError )

它类似于GDALCreateCopy(const char * pszDestFilename,GDALDatasetH hSrcDS,…),所以至少在API级别上有某种形式的一致性。有什么意见吗?

实施

实现将由Faza Mahamood完成。

建议的实现位于 https://github.com/fazam/gdal/tree/gdalinfo .

更改列表: https://github.com/fazam/gdal/compare/gdalinfo

投票历史