矢量数据处理
概述
本页记录了 GeoTools 中的矢量数据处理功能,重点介绍了如何访问、查询、操作和转换地理空间矢量数据。GeoTools 中的矢量数据表示具有几何形状(点、线、多边形)和属性的离散地理要素,主要存储在数据库和其他数据源中。
矢量处理子系统提供:
- 数据库独立 API,具有针对特定数据库的优化实现
- 基于过滤器的查询,转换为 SQL
- Feature 转换和操作功能
- 支持复杂的 feature 类型和 feature 链接
- 与其他 GeoTools 子系统集成
有关栅格数据处理功能,请参阅 栅格数据处理。
矢量数据存储架构
GeoTools 中的矢量数据通过数据存储访问,其中基于 JDBC 的数据存储是用于处理数据库中存储的矢量数据的主要实现。
JDBCDataStore 核心组件
JDBCDataStore 作为矢量数据访问的主要入口点,具有几个关键组件:
| 组件 | 目的 |
|---|---|
SQLDialect | 处理数据库特定操作和 SQL 生成 |
JDBCFeatureSource | 提供对矢量 features 的只读访问 |
JDBCFeatureStore | 使用写入功能扩展 feature source |
FilterToSQL | 将 OGC filters 转换为 SQL WHERE 子句 |
JDBCFeatureReader | 将数据库结果转换为 features |
SQL 方言系统
SQLDialect 抽象在提供一致 API 的同时实现数据库特定优化:
每个方言处理:
- Java 和 SQL 之间的类型映射
- 几何编码/解码
- 数据库的 filter 能力
- 高级数据库特定操作
过滤处理和 SQL 生成
矢量数据处理的关键部分是将 OGC Filter 对象转换为 SQL 语句。
Filter 类型和功能
GeoTools 支持各种用于查询矢量数据的 filter 类型:
| Filter 类别 | 示例 | SQL 转换 |
|---|---|---|
| 逻辑 | And、Or、Not | AND、OR、NOT 操作符 |
| 比较 | Equals、GreaterThan、LessThan | =、>、<、BETWEEN 等 |
| 空间 | Intersects、Within、Contains | ST_Intersects、ST_Within 等 |
| 时间 | After、Before、During | 日期/时间比较 |
| ID | FeatureId | 主键条件 |
| 算术 | Add、Subtract、Multiply | +、-、*、/ 操作符 |
查询优化
矢量处理系统通过几种机制优化查询:
- Filter 分割: 将 filter 分为数据库处理的和内存中的部分
- SQL 生成: 根据数据库功能生成优化的 SQL
- Prepared statements: 使用参数绑定以确保安全和性能
- 空间索引: 当可用时利用数据库空间索引
数据库特定的矢量处理
GeoTools 通过方言实现为不同空间数据库提供优化实现。
PostGIS 矢量处理
PostGIS 方言为带有 PostGIS 的 PostgreSQL 提供专门支持:
- 原生几何类型支持(支持所有 OGC 几何类型)
- 利用 PostGIS 功能的空间函数
- 高级功能,如曲线几何形状和 3D 支持
- 用于存储和查询结构化属性的 JSON/JSONB 支持
主要优化技术:
- 快速边界计算的估计范围使用
- 高效几何传递的 TWKB (Tiny Well-Known Binary)
- 大几何形状的服务器端简化
- 结构化属性的原生 JSON 路径查询
Oracle Spatial 支持
Oracle 方言支持 Oracle 的空间功能:
- SDO_GEOMETRY 类型处理
- Oracle 特定的空间函数和操作符
- 空间元数据集成
- Oracle 空间索引的优化
特殊处理存在于:
- Oracle Spatial 中的曲线几何形状
- 特定距离计算的大地测量数据
- Oracle 特定的 SQL 语法和函数调用
复杂 Feature 处理
除了简单 feature 支持,GeoTools 通过 app-schema 模块提供处理复杂 feature 模型的机制。
App-Schema 架构
app-schema 系统映射简单数据库 features 和由应用程序模式定义的复杂 feature 模型之间:
- AppSchemaDataAccess: 复杂 feature 访问的主要入口点
- FeatureTypeMapping: 将源 feature 类型映射到目标复杂类型
- AttributeMapping: 定义单个属性的映射
- NestedAttributeMapping: 处理复杂 features 中的嵌套元素
- JoiningJDBCFeatureSource: 为 feature 链接优化数据库访问
Feature 链接和连接
复杂功能处理最强大的方面之一是能够链接来自不同源的 features:
- Feature 链接: 基于键属性链接 features
- 数据库连接: 通过尽可能执行 SQL JOIN 来优化访问
- XPath 表达式: 用于映射简单和复杂结构
JoiningJDBCFeatureSource 通过以下方式优化复杂 feature 检索:
- 执行 SQL joins 而不是多个查询
- 保留 feature 顺序以进行高效链接
- 处理自定义连接条件和过滤
高级矢量处理技术
过滤和表达式
GeoTools 为矢量数据操作提供了丰富的表达式系统:
- PropertyName: 访问 feature 属性
- Functions: 执行计算、转换
- Literals: 表示常量值
- 算术表达式: 数学操作
这些表达式用于 filters、转换和映射,以进行矢量数据处理。
事务管理
矢量编辑通过事务管理支持:
- JDBCTransaction: 处理数据库级别事务
- 事务隔离: 控制更改的可见性
- AutoCommit vs. 显式: 支持两种事务模型
- 批处理: 多个 features 的优化写入
聚合操作
矢量处理系统支持直接在数据库中的高效聚合:
- Count: 带有过滤的 feature 计数
- Min/Max: 查找属性的极值
- Sum/Average: 统计计算
- GroupBy: 按类别聚合
这些操作通过尽可能将它们推送到数据库来优化,减少数据传输并提高性能。
性能考虑
优化矢量数据处理性能需要理解几个关键因素:
- 查询优化: 使用可以推送到数据库的适当 filters
- 连接池: 为工作负载适当配置连接池
- Fetch 大小: 控制一次检索多少 features(分页)
- 空间索引: 确保空间索引用于空间查询
- 属性选择: 只请求所需的属性
- Prepared statements: 使用 prepared statements 以确保安全和性能
JDBCDataStore 提供配置选项,如:
fetchSize: 控制每次数据库往返获取的记录数batchInsertSize: 控制多个插入的批量大小exposePrimaryKeyColumns: 控制是否将主键作为属性公开
与其他 GeoTools 子系统的集成
矢量数据处理与其他 GeoTools 子系统集成:
- 渲染系统: 矢量 features 渲染到地图
- 参考系统: 用于坐标转换
- Filter/Expression: 用于查询和操作数据
- 模式子系统: 用于 feature 类型定义
- XML Bindings: 用于复杂 feature 编码/解码
此集成允许矢量数据无缝流经整个 GeoTools 处理流水线。