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完成。