RFC 59 : GDAL/OGR 유틸리티를 라이브러리로

저자: 파자 마하무드(Faza Mahamood)

연락처: fazamhd@gmail.com

상태: RFC 59.1 : GDAL/OGR 유틸리티를 라이브러리로 로 발전하여 이 RFC는 철회

요약

이 RFC는 각 GDAL 유틸리티에 대해 새 함수를 정의합니다. 이 새로운 유틸리티 함수를 사용해서 인메모리 데이터셋에 대해 작업할 수 있습니다. 유틸리티 코드가 새 함수를 호출할 수 있도록 수정합니다. 이 RFC는 gdalinfo를 통해 시연되지만, 다른 유틸리티들로 확장되는 것을 목표로 하는 일반 프레임과 원칙을 제공합니다.

근거

코드로부터 GDAL 유틸리티를 호출해야 할 필요가 있습니다. 그러나 이는 시스템 호출 사용을 수반하며 인메모리 데이터셋에 대해 작업할 수 없습니다.

변경 사항

새 libgdalutils 라이브러리를 생성합니다. 유닉스 및 윈도우 빌드 둘 다 새 라이브러리를 연산에 넣도록 수정했습니다. GDAL 유틸리티가 새 함수를 사용하도록 수정합니다. GDAL 유틸리티의 공개 선언을 담고 있는 새 gdal_utils.h 헤더 파일을 생성합니다. (아직 진행 중인) 현재 헤더는 여기 에서 찾아볼 수 있습니다.

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 바인딩 (파이썬 / 자바 / C# / 펄) 변경 사항

파이썬 바인딩에 대해서만, GDAL 모듈에 새로운 Info(), Translate() 및 Warp() 함수를 추가합니다. 이 함수들은 각각 새로운 GDALInfo(), GDALTranslate() 및 GDALWarp() 함수를 사용합니다. OGR 모듈에는 새 OGR2OGR() 함수를 사용하는 Translate()를 추가합니다.

gdal.InfoOptions()의 속성을 설정하는 데 또는 gdal.Info()의 그때 그때 즉석에서 처리되는(inline) 인자로 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_gdalinfo_lib.py 에서 gdal.Info() 메소드를 테스트합니다. test_gdal_translate_lib.py 에서 gdal.Translate() 메소드를 테스트합니다. test_gdalwarp_lib.py 에서 gdal.Warp() 메소드를 테스트합니다. test_ogr2ogr_lib.py 에서 ogr.Translate() 메소드를 테스트합니다.

호환성 문제점

예상되는 문제점은 없습니다. 명령줄 유틸리티들은 동일한 인터페이스를 유지할 것입니다. autotest/utilities 에서의 유틸리티 테스트를 여전히 통과하는지 확인할 것입니다.

공개 질문

라이브러리화된 ogr2ogr에 어떤 이름을 붙여야 할까요? OGR2OGR() 또는 OGRTranslate()?

GDALTranslate(), GDALWarp() 및 OGR2OGR()에 있는 인자들의 순서는 현재 소스(들) 쪽이라기 보단 대상 쪽입니다.

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 수준에서는 일관적인 형식이 존재합니다. 의견이 있으신 분?

관련 티켓

구현

파자 마하무드가 이 RFC를 구현할 것입니다.

제안한 구현은 “gdalinfo” 브랜치 에 있습니다.

변경 사항 목록

투표 이력