Skip to content

矢量数据处理 ​

概述 ​

本页记录了 GeoTools 中的矢量数据处理功能,重点介绍了如何访问、查询、操作和转换地理空间矢量数据。GeoTools 中的矢量数据表示具有几何形状(点、线、多边形)和属性的离散地理要素,主要存储在数据库和其他数据源中。

矢量处理子系统提供:

  • 数据库独立 API,具有针对特定数据库的优化实现
  • 基于过滤器的查询,转换为 SQL
  • Feature 转换和操作功能
  • 支持复杂的 feature 类型和 feature 链接
  • 与其他 GeoTools 子系统集成

有关栅格数据处理功能,请参阅 栅格数据处理。

矢量数据存储架构 ​

GeoTools 中的矢量数据通过数据存储访问,其中基于 JDBC 的数据存储是用于处理数据库中存储的矢量数据的主要实现。

SVG
100%

JDBCDataStore 核心组件 ​

JDBCDataStore 作为矢量数据访问的主要入口点,具有几个关键组件:

组件目的
SQLDialect处理数据库特定操作和 SQL 生成
JDBCFeatureSource提供对矢量 features 的只读访问
JDBCFeatureStore使用写入功能扩展 feature source
FilterToSQL将 OGC filters 转换为 SQL WHERE 子句
JDBCFeatureReader将数据库结果转换为 features

SQL 方言系统 ​

SQLDialect 抽象在提供一致 API 的同时实现数据库特定优化:

SVG
100%

每个方言处理:

  • Java 和 SQL 之间的类型映射
  • 几何编码/解码
  • 数据库的 filter 能力
  • 高级数据库特定操作

过滤处理和 SQL 生成 ​

矢量数据处理的关键部分是将 OGC Filter 对象转换为 SQL 语句。

SVG
100%

Filter 类型和功能 ​

GeoTools 支持各种用于查询矢量数据的 filter 类型:

Filter 类别示例SQL 转换
逻辑And、Or、NotAND、OR、NOT 操作符
比较Equals、GreaterThan、LessThan=、>、<、BETWEEN 等
空间Intersects、Within、ContainsST_Intersects、ST_Within 等
时间After、Before、During日期/时间比较
IDFeatureId主键条件
算术Add、Subtract、Multiply+、-、*、/ 操作符

查询优化 ​

矢量处理系统通过几种机制优化查询:

  1. Filter 分割: 将 filter 分为数据库处理的和内存中的部分
  2. SQL 生成: 根据数据库功能生成优化的 SQL
  3. Prepared statements: 使用参数绑定以确保安全和性能
  4. 空间索引: 当可用时利用数据库空间索引

数据库特定的矢量处理 ​

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 模型的机制。

SVG
100%

App-Schema 架构 ​

app-schema 系统映射简单数据库 features 和由应用程序模式定义的复杂 feature 模型之间:

  • AppSchemaDataAccess: 复杂 feature 访问的主要入口点
  • FeatureTypeMapping: 将源 feature 类型映射到目标复杂类型
  • AttributeMapping: 定义单个属性的映射
  • NestedAttributeMapping: 处理复杂 features 中的嵌套元素
  • JoiningJDBCFeatureSource: 为 feature 链接优化数据库访问

Feature 链接和连接 ​

复杂功能处理最强大的方面之一是能够链接来自不同源的 features:

  1. Feature 链接: 基于键属性链接 features
  2. 数据库连接: 通过尽可能执行 SQL JOIN 来优化访问
  3. XPath 表达式: 用于映射简单和复杂结构

JoiningJDBCFeatureSource 通过以下方式优化复杂 feature 检索:

  • 执行 SQL joins 而不是多个查询
  • 保留 feature 顺序以进行高效链接
  • 处理自定义连接条件和过滤

高级矢量处理技术 ​

过滤和表达式 ​

GeoTools 为矢量数据操作提供了丰富的表达式系统:

  • PropertyName: 访问 feature 属性
  • Functions: 执行计算、转换
  • Literals: 表示常量值
  • 算术表达式: 数学操作

这些表达式用于 filters、转换和映射,以进行矢量数据处理。

事务管理 ​

矢量编辑通过事务管理支持:

  • JDBCTransaction: 处理数据库级别事务
  • 事务隔离: 控制更改的可见性
  • AutoCommit vs. 显式: 支持两种事务模型
  • 批处理: 多个 features 的优化写入

聚合操作 ​

矢量处理系统支持直接在数据库中的高效聚合:

  • Count: 带有过滤的 feature 计数
  • Min/Max: 查找属性的极值
  • Sum/Average: 统计计算
  • GroupBy: 按类别聚合

这些操作通过尽可能将它们推送到数据库来优化,减少数据传输并提高性能。

性能考虑 ​

优化矢量数据处理性能需要理解几个关键因素:

  1. 查询优化: 使用可以推送到数据库的适当 filters
  2. 连接池: 为工作负载适当配置连接池
  3. Fetch 大小: 控制一次检索多少 features(分页)
  4. 空间索引: 确保空间索引用于空间查询
  5. 属性选择: 只请求所需的属性
  6. Prepared statements: 使用 prepared statements 以确保安全和性能

JDBCDataStore 提供配置选项,如:

  • fetchSize: 控制每次数据库往返获取的记录数
  • batchInsertSize: 控制多个插入的批量大小
  • exposePrimaryKeyColumns: 控制是否将主键作为属性公开

与其他 GeoTools 子系统的集成 ​

矢量数据处理与其他 GeoTools 子系统集成:

  1. 渲染系统: 矢量 features 渲染到地图
  2. 参考系统: 用于坐标转换
  3. Filter/Expression: 用于查询和操作数据
  4. 模式子系统: 用于 feature 类型定义
  5. XML Bindings: 用于复杂 feature 编码/解码

此集成允许矢量数据无缝流经整个 GeoTools 处理流水线。