核心架构
GeoTools 核心架构定义了支持整个 GeoTools 库的基础组件和设计原则。本文档解释了主要架构元素、它们之间的关系以及 GeoTools 代码库的整体组织。有关特定实现的信息,请参阅相应的功能特定页面。
整体架构
GeoTools 遵循模块化架构,围绕地理空间数据处理的关键抽象进行组织。项目结构分为多个层次,组件之间具有清晰的依赖关系。
核心模块
GeoTools 库围绕一组基本模块设计,这些模块为所有功能提供基础:
| 模块 | 目的 | 关键抽象 |
|---|---|---|
| gt-api | 核心接口 | DataStore、Feature、FeatureSource、Filter |
| gt-metadata | 基础服务和工具 | Citations、Logging、Factory 系统 |
| gt-referencing | 坐标参考系统 | CRS、MathTransform、Position、Bounds |
| gt-main | 默认实现 | DataStore 实现、Geometry 工具 |
| gt-coverage | 栅格数据处理 | GridCoverage2D、GridCoverageReader |
这些模块构成了 GeoTools 的骨干,通过精心管理的依赖关系确保高级组件可以独立使用。gt-api 模块(原 gt-opengis)定义了在整个库中实现的核心接口。
数据模型
GeoTools 实现了一个综合的数据模型来处理矢量和栅格地理空间数据。
空间数据抽象
GeoTools 中的空间数据模型建立在几个关键抽象之上:
- Feature: 矢量数据的基本单位,通常表示具有属性和几何形状的地理实体
- GridCoverage2D: 栅格数据的基本单位,将渲染图像与空间参考信息耦合
- Position: 表示坐标空间中的点 (GeoTools 30.x 中替换了 DirectPosition)
- Bounds: 表示坐标空间中的边界框 (GeoTools 30.x 中替换了 Envelope)
- CoordinateReferenceSystem: 定义 features 和 coverages 的空间参考系统
最常用的实现之一是 ReferencedEnvelope,它将 JTS Envelope 与坐标参考系统结合:
数据访问框架
GeoTools 数据访问框架提供了一致的 API,用于从各种来源访问矢量和栅格数据。
该框架围绕以下核心接口设计:
DataAccess/DataStore: 用于矢量数据访问
- ContentDataStore: 大多数基于文件的数据存储的基础实现
- JDBCDataStore: 数据库支持的数据存储的基础实现
FeatureSource: 提供对矢量数据的查询功能
- FeatureCollection: 查询的结果,提供对 Features 的迭代
GridCoverageReader: 用于栅格数据访问
- AbstractGridCoverageReader: 基础实现
- 格式特定的实现 (GeoTIFF、ImageMosaic 等)
模块依赖
GeoTools 模块具有一组精心管理的依赖关系,旨在最小化耦合并防止循环依赖。
依赖结构的设计确保:
- API 模块具有最少的依赖
- 实现模块依赖于 API,但反之不然
- 可选依赖被明确标记和隔离
- 高级模块(如 gt-coverage)可以依赖于低级模块(如 gt-main),但反之不然
Factory 系统
GeoTools 使用 factory 系统来实例化关键接口的实现。这允许:
- 接口与实现的分离
- 可插拔的实现
- 基于提示的实现选择自定义
常用使用模式:
FilterFactory ff = CommonFactoryFinder.getFilterFactory();
Filter filter = ff.equals(ff.property("name"), ff.literal("value"));显著的架构变更
在 GeoTools 30.x 中,发生了重大的架构变更,删除了 org.opengis 包,将接口移至 org.geotools.api。主要变更包括:
- 将
gt-opengis模块重命名为gt-api - 将接口从
org.opengis.*移至org.geotools.api.* - 将
FilterFactory2合并到FilterFactory - 用
Position替换DirectPosition - 用
Bounds替换Envelope - 将样式接口移至
org.geotools.api.style
扩展点
GeoTools 设计为可以通过多种机制进行扩展:
- Plugins: 实现特定的 DataStore 或 GridCoverageReader 接口
- Factories: 注册核心接口的自定义实现
- Extensions: 基于核心模块添加专门的功能
插件通过 Java 的 ServiceLoader 机制发现,服务文件位于 META-INF/services/ 中。
结论
GeoTools 核心架构为地理空间数据处理提供了一个灵活且可扩展的框架。其特点包括:
- 模块化设计,具有清晰的接口和实现分离
- 允许可插拔组件的 factory 系统
- 矢量和栅格数据的强抽象
- 支持各种数据格式的灵活数据访问框架
- 全面的坐标参考系统支持
此架构构成了所有其他 GeoTools 子系统和扩展的基础。