Skip to content

复杂 Features ​

GeoTools 中的复杂 Features 指的是 App-Schema 模块中的实现,它能够处理在 GML 应用程序模式中定义的复杂 feature 类型。与具有扁平结构的简单 features 不同,复杂 features 可以具有嵌套属性、feature 引用和复杂属性类型,从而更好地表示具有复杂关系的现实世界数据。

本文档描述了 App-Schema 模块的架构和功能,重点介绍了它如何将数据从简单源(如数据库)映射到复杂 feature 类型。

有关可与复杂 features 一起使用的数据源的信息,请参阅 JDBC 数据存储。

架构概述 ​

App-Schema 模块围绕源数据和目标模式之间的映射构建。它使用复杂的映射系统将简单 features 转换为复杂 features。

SVG
100%

关键组件:

  1. AppSchemaDataAccess: 为复杂 features 实现 DataAccess<FeatureType, Feature> 接口的主要数据访问类。
  2. FeatureTypeMapping: 定义源 feature 类型和目标复杂 feature 类型之间的映射。
  3. AttributeMapping: 指定单个属性如何从源映射到目标。
  4. NestedAttributeMapping: 用于嵌套/链接 features 的特殊映射类型。
  5. DataAccessMappingFeatureIterator: 迭代源 features 并应用映射以创建复杂 features。
  6. XPath: 用于使用 XPath 表达式评估和构造属性的工具。
  7. UnmappingFilterVisitor: 将复杂 features 上的 filters 转换为源 features 上的 filters。

Feature 映射过程 ​

feature 映射过程通过应用配置的映射将源 features 转换为复杂 features。

SVG
100%

映射过程步骤:

  1. 客户端通过查询请求复杂 features
  2. 查询被转换为在源 features 上操作
  3. 从数据源检索源 features
  4. 处理每个源 feature 以创建复杂 feature:
    • 对于每个属性映射,从源提取值
    • 使用 XPath 将值放置在目标结构中的正确位置
  5. 结果复杂 features 返回给客户端

属性映射 ​

属性映射定义如何将值从源 features 映射到复杂 features。主要有两种类型:

  1. 简单属性映射: 将简单属性从源映射到目标
  2. 嵌套属性映射: 映射包含嵌套 features 的复杂属性

每个 AttributeMapping 包含:

  • 源表达式: 如何从源 feature 提取值(通常是 OGC CQL 表达式)
  • 目标 XPath: 值在目标 feature 结构中的放置位置
  • 可选客户端属性: 在属性上设置的额外属性

XML 配置中的属性映射示例:

<AttributeMapping>
  <targetAttribute>gsml:description</targetAttribute>
  <sourceExpression>
    <OCQL>DESCRIPTION</OCQL>
  </sourceExpression>
</AttributeMapping>

XPath 工具用于评估这些表达式并根据映射构建复杂结构。

Feature 链接 ​

Feature 链接是一个强大的功能,允许复杂 features 引用或包含其他 features。这使用 NestedAttributeMapping 实现。

SVG
100%

feature 链接有两种方法:

  1. 标准链接: 逐个检索嵌套 features
  2. 连接: 使用 SQL joins 高效检索嵌套 features(对于数据库源)

对于数据库源,通过 JoiningNestedAttributeMapping 和 JoiningJDBCFeatureSource 实现连接,它们使用 SQL joins 优化嵌套 features 的检索。

在 XML 配置中,feature 链接使用 linkElement 和 linkField 元素定义:

<AttributeMapping>
  <targetAttribute>gsml:composition</targetAttribute>
  <sourceExpression>
    <OCQL>ID</OCQL>
    <linkElement>gsml:CompositionPart</linkElement>
    <linkField>gsml:GeologicUnit/gsml:id</linkField>
  </sourceExpression>
  <isMultiple>true</isMultiple>
</AttributeMapping>

查询和过滤 ​

查询复杂 features 涉及转换查询和 filters 以在源 features 上操作。

SVG
100%

此过程中的关键组件是:

  1. UnmappingFilterVisitor: 将复杂 features 上的 filters 转换为源 features 上的等效 filters
  2. ComplexFilterSplitter: 将 filter 分割为:
    • 前-filter: 在源(数据库/数据存储级别)应用
    • 后-filter: 在 feature 映射后应用(在内存中)
  3. NestedFilterToSQL: 对于数据库源,将嵌套属性上的 filters 编码为 SQL

此方法通过将尽可能多的查询推送到源数据存储来实现高效过滤。

配置 ​

App-Schema 使用定义源数据存储和目标复杂 feature 类型之间关系的 XML 映射文件配置。

基本配置结构 ​

<AppSchemaDataAccess>
  <namespaces>
    <!-- 命名空间定义 -->
  </namespaces>
  <sourceDataStores>
    <!-- 源数据存储定义 -->
  </sourceDataStores>
  <targetTypes>
    <!-- 目标类型定义 -->
  </targetTypes>
  <typeMappings>
    <!-- 类型映射定义 -->
  </typeMappings>
</AppSchemaDataAccess>

配置的组件 ​

  1. namespaces: 定义映射中使用的命名空间前缀
  2. sourceDataStores: 定义源数据存储(例如,数据库、shapefiles)
  3. targetTypes: 定义目标复杂类型(引用 XML 模式)
  4. typeMappings: 定义源和目标类型之间的映射

类型映射示例 ​

<TypeMapping>
  <sourceDataStore>postgisDataStore</sourceDataStore>
  <sourceType>geologic_units</sourceType>
  <targetElement>gsml:GeologicUnit</targetElement>
  <attributeMappings>
    <AttributeMapping>
      <targetAttribute>gsml:description</targetAttribute>
      <sourceExpression>
        <OCQL>description</OCQL>
      </sourceExpression>
    </AttributeMapping>
    <!-- Feature 链接示例 -->
    <AttributeMapping>
      <targetAttribute>gsml:composition</targetAttribute>
      <sourceExpression>
        <OCQL>id</OCQL>
        <linkElement>gsml:CompositionPart</linkElement>
        <linkField>gsml:GeologicUnit/gsml:id</linkField>
      </sourceExpression>
      <isMultiple>true</isMultiple>
    </AttributeMapping>
  </attributeMappings>
</TypeMapping>

配置由 XMLConfigDigester 和 AppSchemaDataAccessConfigurator 处理以创建必要的映射和数据访问对象。

性能考虑 ​

App-Schema 模块包括几个优化以提高性能:

用于 Feature 链接的连接 ​

对于数据库源,使用连接来高效检索嵌套 features:

SVG
100%

不是用单独的查询检索嵌套 features,单个 SQL JOIN 查询可以检索所有必要的数据,显著提高深层 feature 层次的性能。

Filter 推送 ​

ComplexFilterSplitter 通过尽可能将 filters 推送到源来优化查询:

SVG
100%

这减少了需要传输和处理的数据量。

常见用例 ​

App-Schema 模块特别适用于:

  1. GML 应用程序模式支持: 将数据库表映射到 GML 应用程序模式,如 GeoSciML、INSPIRE 或自定义模式
  2. 复杂数据结构: 表示复杂的地质、水文学或其他具有层次关系的科学数据
  3. OGC Web 服务: 提供具有复杂 feature 支持的 WFS 服务

示例: 具有组合部分的地质单元 ​

SVG
100%

这种复杂结构可以使用 App-Schema feature 链接从更简单的数据库表映射,允许以符合标准的方式表示复杂的地质信息。