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