RFC 43:GDALMajorObject::GetMetadataDomainList
作者:连鲁奥
联系人:spatialys.com上的even dot rouault
总结
这个(mini)RFC在GDALMajorObject类(和一个C API)中提出了一个新的虚拟方法GetMetadataDomainList(),以返回所有可用元数据域的列表。
背景
GDALMajorObject当前提供GetMetadata()和GetMetadataItem()方法,它们都接受元数据域参数。但无法自动发现哪些元数据域对给定的GDALMajorObject(即数据集或栅格带)有效。这使得不可能有通用代码来彻底地发现数据集/栅格带中的所有元数据。
实施
GDALMajorObject中的基本实现只调用内部oMDMD成员上的GetDomainList()。
/************************************************************************/
/* GetMetadataDomainList() */
/************************************************************************/
/**
* \brief Fetch list of metadata domains.
*
* The returned string list is the list of (non-empty) metadata domains.
*
* This method does the same thing as the C function GDALGetMetadataDomainList().
*
* @return NULL or a string list. Must be freed with CSLDestroy()
*
* @since GDAL 1.11
*/
char **GDALMajorObject::GetMetadataDomainList()
{
return CSLDuplicate(oMDMD.GetDomainList());
}
此方法在C API(char * * CPL_STDCALL GDALGetMetadataDomainList(GDALMajorObjectH hObject))和Swig绑定。
受影响的驱动程序
当不修改oMDMD成员时,具有GetMetadata()和/或GetMetadataItem()自定义实现的驱动程序通常还必须实现GetMetadataDomainList()。
为了便于实现专用的GetMetadataDomainList(),GDALMajorObject将提供一个受保护的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()返回非空值的每个域。
在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,GetMetadataDomainList()在频带级别将返回“LocationInfo”作为有效的元数据域(由gdallocationinfo实用程序使用),即使GetMetadata(“LocationInfo”)本身不返回元数据:您必须调用GetMetadataItem(“Pixel砦someX砦someY”、“LocationInfo”)或GetMetadataItem(“GeoPixel砦someX砦someY”,“位置信息”)。
对于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驱动程序进行完全重建。
测试
Python自动测试套件将被扩展,以便在几个驱动程序中测试新的API。
车票
已开出5275号罚单,以跟踪此RFC的进度。
该实现可在 an attachment to ticket 5275 .
投票历史
+1名来自Evner、DanielM和JukkaR