复杂 Features
GeoTools 中的复杂 Features 指的是 App-Schema 模块中的实现,它能够处理在 GML 应用程序模式中定义的复杂 feature 类型。与具有扁平结构的简单 features 不同,复杂 features 可以具有嵌套属性、feature 引用和复杂属性类型,从而更好地表示具有复杂关系的现实世界数据。
本文档描述了 App-Schema 模块的架构和功能,重点介绍了它如何将数据从简单源(如数据库)映射到复杂 feature 类型。
有关可与复杂 features 一起使用的数据源的信息,请参阅 JDBC 数据存储。
架构概述
App-Schema 模块围绕源数据和目标模式之间的映射构建。它使用复杂的映射系统将简单 features 转换为复杂 features。
关键组件:
- AppSchemaDataAccess: 为复杂 features 实现
DataAccess<FeatureType, Feature>接口的主要数据访问类。 - FeatureTypeMapping: 定义源 feature 类型和目标复杂 feature 类型之间的映射。
- AttributeMapping: 指定单个属性如何从源映射到目标。
- NestedAttributeMapping: 用于嵌套/链接 features 的特殊映射类型。
- DataAccessMappingFeatureIterator: 迭代源 features 并应用映射以创建复杂 features。
- XPath: 用于使用 XPath 表达式评估和构造属性的工具。
- UnmappingFilterVisitor: 将复杂 features 上的 filters 转换为源 features 上的 filters。
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/FeatureTypeMapping.java
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/filter/XPath.java
Feature 映射过程
feature 映射过程通过应用配置的映射将源 features 转换为复杂 features。
映射过程步骤:
- 客户端通过查询请求复杂 features
- 查询被转换为在源 features 上操作
- 从数据源检索源 features
- 处理每个源 feature 以创建复杂 feature:
- 对于每个属性映射,从源提取值
- 使用 XPath 将值放置在目标结构中的正确位置
- 结果复杂 features 返回给客户端
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java143-180
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java550-782
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java432-520
属性映射
属性映射定义如何将值从源 features 映射到复杂 features。主要有两种类型:
- 简单属性映射: 将简单属性从源映射到目标
- 嵌套属性映射: 映射包含嵌套 features 的复杂属性
每个 AttributeMapping 包含:
- 源表达式: 如何从源 feature 提取值(通常是 OGC CQL 表达式)
- 目标 XPath: 值在目标 feature 结构中的放置位置
- 可选客户端属性: 在属性上设置的额外属性
XML 配置中的属性映射示例:
<AttributeMapping>
<targetAttribute>gsml:description</targetAttribute>
<sourceExpression>
<OCQL>DESCRIPTION</OCQL>
</sourceExpression>
</AttributeMapping>XPath 工具用于评估这些表达式并根据映射构建复杂结构。
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AttributeMapping.java
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/filter/XPath.java143-183
- modules/extension/app-schema/app-schema/src/test/resources/test-data/AppSchemaDataAccess.xsd
Feature 链接
Feature 链接是一个强大的功能,允许复杂 features 引用或包含其他 features。这使用 NestedAttributeMapping 实现。
feature 链接有两种方法:
- 标准链接: 逐个检索嵌套 features
- 连接: 使用 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>- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/NestedAttributeMapping.java59-90
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/joining/JoiningNestedAttributeMapping.java55-130
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/appschema/jdbc/JoiningJDBCFeatureSource.java88-150
查询和过滤
查询复杂 features 涉及转换查询和 filters 以在源 features 上操作。
此过程中的关键组件是:
- UnmappingFilterVisitor: 将复杂 features 上的 filters 转换为源 features 上的等效 filters
- ComplexFilterSplitter: 将 filter 分割为:
- 前-filter: 在源(数据库/数据存储级别)应用
- 后-filter: 在 feature 映射后应用(在内存中)
- NestedFilterToSQL: 对于数据库源,将嵌套属性上的 filters 编码为 SQL
此方法通过将尽可能多的查询推送到源数据存储来实现高效过滤。
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/filter/UnmappingFilterVisitor.java125-180
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/filter/ComplexFilterSplitter.java70-150
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/appschema/jdbc/NestedFilterToSQL.java113-200
配置
App-Schema 使用定义源数据存储和目标复杂 feature 类型之间关系的 XML 映射文件配置。
基本配置结构
<AppSchemaDataAccess>
<namespaces>
<!-- 命名空间定义 -->
</namespaces>
<sourceDataStores>
<!-- 源数据存储定义 -->
</sourceDataStores>
<targetTypes>
<!-- 目标类型定义 -->
</targetTypes>
<typeMappings>
<!-- 类型映射定义 -->
</typeMappings>
</AppSchemaDataAccess>配置的组件
- namespaces: 定义映射中使用的命名空间前缀
- sourceDataStores: 定义源数据存储(例如,数据库、shapefiles)
- targetTypes: 定义目标复杂类型(引用 XML 模式)
- 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 处理以创建必要的映射和数据访问对象。
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AppSchemaDataAccessConfigurator.java112-180
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/XMLConfigDigester.java
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccessFactory.java55-100
性能考虑
App-Schema 模块包括几个优化以提高性能:
用于 Feature 链接的连接
对于数据库源,使用连接来高效检索嵌套 features:
不是用单独的查询检索嵌套 features,单个 SQL JOIN 查询可以检索所有必要的数据,显著提高深层 feature 层次的性能。
Filter 推送
ComplexFilterSplitter 通过尽可能将 filters 推送到源来优化查询:
这减少了需要传输和处理的数据量。
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/appschema/jdbc/JoiningJDBCFeatureSource.java250-350
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/filter/ComplexFilterSplitter.java200-300
- modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessRegistry.java48-100
常见用例
App-Schema 模块特别适用于:
- GML 应用程序模式支持: 将数据库表映射到 GML 应用程序模式,如 GeoSciML、INSPIRE 或自定义模式
- 复杂数据结构: 表示复杂的地质、水文学或其他具有层次关系的科学数据
- OGC Web 服务: 提供具有复杂 feature 支持的 WFS 服务
示例: 具有组合部分的地质单元
这种复杂结构可以使用 App-Schema feature 链接从更简单的数据库表映射,允许以符合标准的方式表示复杂的地质信息。