元数据

本章介绍OTB如何处理元数据。

OtbImageMetadata

OTB使用类 otbImageMetadataotbImageMetadataBase 来存储元数据。

../_images/UmlImageMetadata.png

otbImageMetadataBase 封装了七个 std::map 要存储七种不同的元数据,请执行以下操作:

  • 可以存储为双精度型的元数据的数字元数据
  • 可存储为std::字符串的元数据的字符串元数据
  • LUT 1D元数据可以存储为一维表的元数据
  • 可存储为二维表的元数据的LUT二维元数据
  • 可存储为时间对象的元数据的时间元数据
  • 表示模型的元数据的几何元数据
  • 存储为std::字符串的非泛型元数据的额外元数据

地图的密钥在文件中进行了描述 otbMetaDataKey.h 。该文件还定义了时间对象。

对于每个映射,该类提供了4个方法:

  • 这个 [] operator 对于只读访问键中的元数据
  • 这个 Add 方法来设置元数据值。
  • 这个 Remove 用于删除元数据值的方法
  • 这个 Has 方法来测试键是否有值

的一个实例 otbImageMetadata 用于存储元数据。它继承自 otbImageMetadataBase 因此,它封装了用于存储元数据的七个映射。它还包含一个向量 otbImageMetadataBase 存储特定于波段的元数据 (m_Bands )。

元数据工作流

OTB通过下图描述的工作流在产品之间读写元数据:

../_images/MetadataWorkflow.png
  • GDAL输入/输出功能封装在 otbGDALImageIO 类,该类派生自 otbImageIO 。此类负责从产品获取元数据(从类继承的供应商功能 otbMetadataSupplierInterface ),并将它们作为关键字列表存储在存储器中。它还负责将元数据写入产品(从类继承的存储功能 otbMetadataStorageInterface )。

  • 然后调用ImageMetadataInterface(IMI)来解析元数据。每个传感器有一个IMI。我们使用经典的Factory来找出哪一个可以解析产品的元数据。IMI的parse方法将从ImageIO中提取元数据并填充ImageMetadata对象。

  • 有些元数据不被GDAL读取。要解析这些元数据,IMI可以呼叫其他供应商,具体取决于文件格式:

    • 为了解析XML文件, otbXMLMetadataSupplier 使用GDAL的XML解析机制(“GDALMDReaderBase”类中的“ReadXMLToList”方法)将XML文件转换为GDAL ListString,它是一系列‘key=value’对。
    • 为了解析文本文件,TextMetadataSupplier尝试解析‘key=value’对。

    如果需要,可以添加其他供应商。这些课程(包括 otbGDALImageIO )都实现了该方法 GetMetadataValue 它从给定键返回元数据的值。基类还实现了方法 GetAsGetAsVector 由IMI使用。

  • IMI在不同的元数据供应商中查找相关的元数据,并使用 Add 方法来存储元数据。如果解析成功返回,则生成的ImageMetadata被提供给通过管道传播的ImageCommon。