RFC 43: GDALMajorObject::GetMetadataDomainList
저자: 이벤 루올
연락처: even.rouault@spatialys.com
요약
이 (소규모) RFC는 GDALMajorObject
클래스(및 C API)에 사용할 수 있는 모든 메타데이터 도메인을 반환하는 새로운 GetMetadataDomainList()
가상 메소드를 추가할 것을 제안합니다.
배경
GDALMajorObject
클래스는 현재 메타데이터 도메인 인자를 입력받는 GetMetadata()
및 GetMetadataItem()
2개의 메소드를 제공합니다. 그러나 지정한 GDALMajorObject
에서 (예를 들면 데이터셋 또는 래스터 밴드에서) 어떤 메타데이터 도메인들이 무결한지 자동으로 발견할 수 있는 방법이 없습니다. 때문에 데이터셋/래스터 밴드에 있는 모든 메타데이터를 철저하게 발견할 수 있는 일반 코드를 가질 수가 없게 됩니다.
구현
GDALMajorObject
의 기반 구현은 내부 ‘oMDMD’ 멤버에 대해 GetDomainList()
를 호출할 뿐입니다.
/************************************************************************/
/* GetMetadataDomainList() */
/************************************************************************/
/*
* \brief 메타데이터 도메인 목록을 가져옵니다.
*
* (비어 있지 않은) 메타데이터 도메인들의 목록인 문자열 목록을 반환합니다.
*
* 이 메소드는 GDALGetMetadataDomainList() C 함수와 동일한 작업을 수행합니다.
*
* @return NULL 또는 문자열 목록을 반환합니다. CSLDestroy()로 목록을 해제해야만 합니다.
*
* @since GDAL 1.11
*/
char **GDALMajorObject::GetMetadataDomainList()
{
return CSLDuplicate(oMDMD.GetDomainList());
}
C API(char ** CPL_STDCALL GDALGetMetadataDomainList( GDALMajorObjectH hObject)
)와 SWIG 바인딩에서도 이 메소드를 사용할 수 있습니다.
영향을 받는 드라이버
GetMetadata() 그리고/또는 GetMetadataItem()을 사용자 지정 구현한 드라이버들은 일반적으로 ‘oMDMD’ 멤버를 수정하지 않는 경우 GetMetadataDomainList()도 구현해야 할 것입니다.
특화된 GetMetadataDomainList() 메소드를 쉽게 구현하기 위해, GDALMajorObject
클래스가 다음과 같이 사용할 수 있는 보호된(protected) BuildMetadataDomainList() 메소드를 제공할 것입니다:
/************************************************************************/
/* GetMetadataDomainList() */
/************************************************************************/
char **NITFDataset::GetMetadataDomainList()
{
return BuildMetadataDomainList(GDALPamDataset::GetMetadataDomainList(),
TRUE,
"NITF_METADATA", "NITF_DES", "NITF_DES_METADATA",
"NITF_FILE_HEADER_TRES", "NITF_IMAGE_SEGMENT_TRES",
"CGM", "TEXT", "TRE", "xml:TRE", "OVERVIEWS", NULL);
}
TRUE
파라미터는 그 뒤에 오는 도메인 목록이 잠재적 도메인들임을 의미하기 때문에, BuildMetadataDomainList()가 GetMetadata()가 반환하는 각 도메인이 NULL이 아닌 값인지 확인할 것입니다.
GDAL 드라이버들에 대해 철저하게 검색해서 GetMetadataDomainList() 메소드를 구현하도록 업데이트해야 할 드라이버들을 모두 업데이트했습니다:
ADRG
BAG
CEOS2
DIMAP
ECW ENVISAT
ERS
GeoRaster (컴파일되는지 확인하지 못 했습니다)
GIF
GTiff
HDF4
JPEG
MBTILES
netCDF
NITF
OGDI
PCIDSK
PDF
PNG
PostgisRaster
RasterLite
RS2
VRT
WCS
WebP
WMS
몇 가지 주의할 점:
MBTiles, WMS 및 VRT 드라이버의 경우
GetMetadata("LocationInfo")
자체가 메타데이터를 반환하지 않더라도, 밴드 수준에서 GetMetadataDomainList()가 “LocationInfo”를 (gdallocationinfo 유틸리티가 사용하는) 무결한 메타데이터 도메인으로 반환할 것입니다:GetMetadataItem("Pixel_someX_someY", "LocationInfo")
또는GetMetadataItem("GeoPixel_someX_someY", "LocationInfo")
를 호출해야 합니다.CEOS2 및 ENVISAT 드라이버의 경우, 메타데이터 도메인 목록을 쉽게 확정할 수 없습니다. GetMetadataDomainList() 메소드는 받아들일 수 있는 도메인 이름들의 패턴을 반환할 것입니다.
영향을 받는 유틸리티
gdalinfo 유틸리티가 다음을 입력받을 수 있도록 확장합니다:
사용할 수 있는 메타데이터 도메인들을 출력할 “-listmdd” 옵션:
$ gdalinfo ../autotest/gdrivers/data/byte_with_xmp.jpg -listmdd
Driver: JPEG/JPEG JFIF
Files: ../autotest/gdrivers/data/byte_with_xmp.jpg
Size is 20, 20
Coordinate System is `'
Metadata domains:
xml:XMP
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 20.0)
Upper Right ( 20.0, 0.0)
Lower Right ( 20.0, 20.0)
Center ( 10.0, 10.0)
Band 1 Block=20x1 Type=Byte, ColorInterp=Gray
Metadata domains:
IMAGE_STRUCTURE
Image Structure Metadata:
COMPRESSION=JPEG
모든 메타데이터 도메인의 내용을 출력할 “-mdd all” 옵션:
$ gdalinfo ../autotest/gdrivers/data/byte_with_xmp.jpg -mdd all
Driver: JPEG/JPEG JFIF
Files: ../autotest/gdrivers/data/byte_with_xmp.jpg
Size is 20, 20
Coordinate System is `'
Metadata (xml:XMP):
<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.89'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<rdf:Description rdf:about=''
xmlns:dc='http://purl.org/dc/elements/1.1/'>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang='x-default'>Description</rdf:li>
</rdf:Alt>
</dc:description>
<dc:subject>
<rdf:Bag>
<rdf:li>XMP</rdf:li>
<rdf:li>Test</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:title>
</rdf:Alt>
</dc:title>
</rdf:Description>
<rdf:Description rdf:about=''
xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
<tiff:BitsPerSample>
<rdf:Seq>
<rdf:li>8</rdf:li>
</rdf:Seq>
</tiff:BitsPerSample>
<tiff:Compression>1</tiff:Compression>
<tiff:ImageLength>20</tiff:ImageLength>
<tiff:ImageWidth>20</tiff:ImageWidth>
<tiff:PhotometricInterpretation>1</tiff:PhotometricInterpretation>
<tiff:PlanarConfiguration>1</tiff:PlanarConfiguration>
<tiff:SamplesPerPixel>1</tiff:SamplesPerPixel>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end='w'?>
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 20.0)
Upper Right ( 20.0, 0.0)
Lower Right ( 20.0, 20.0)
Center ( 10.0, 10.0)
Band 1 Block=20x1 Type=Byte, ColorInterp=Gray
Image Structure Metadata:
COMPRESSION=JPEG
하위 호환성
이 변경 사항은 C API/ABI 및 C++ API 수준에서 하위 호환성에 어떤 영향도 미치지 않습니다. 그러나 C++ ABI 수준에서는 영향을 미치기 때문에, 모든 GDAL 드라이버를 완전히 다시 빌드해야 합니다.
테스트
파이썬 자동 테스트 스위트가 몇몇 드라이버에서 새 API를 테스트하도록 확장시킬 것입니다.
티켓
이 RFC의 진행 상황을 추적하는 #5275 티켓을 열었습니다.
#5275 티켓 첨부 파일 로 이 RFC의 구현을 사용할 수 있습니다.
투표 이력
이벤 루올 +1
대니얼 모리셋 +1
유카 라흐코넨 +1