空间数据模型
GeoTools 中的空间数据模型提供了用于表示地理要素及其范围的基本几何构造。本页解释了定义空间对象的核心数据结构、它们的参考系统以及它们在 GeoTools 库中的交互方式。有关这些结构在数据访问框架中如何使用的信息,请参阅 数据访问框架。
核心组件
GeoTools 空间数据模型由几个关键组件组成,它们协同工作以一致的方式表示几何形状:
- Positions - 坐标空间中的点
- Bounds/Envelopes - 坐标空间中的矩形范围
- Coordinate Reference Systems - 定义坐标的参考框架
- modules/library/referencing/src/main/java/org/geotools/geometry/package-info.java
- modules/library/main/src/main/java/org/geotools/geometry/jts/ReferencedEnvelope.java
- modules/library/referencing/src/main/java/org/geotools/geometry/GeneralBounds.java
Position
Position 表示坐标空间中的一个点。它是 GeoTools 中几何形状的基本构建块,可以表示任意维度的坐标。
Position 实现一旦创建通常是不可变的,允许在线程之间安全共享。主要实现包括:
GeneralPosition: 可以表示 n 维空间中位置的通用实现
Position2D: 提供方便方法处理 x 和 y 坐标的专门 2D 位置
modules/library/referencing/src/test/java/org/geotools/geometry/PositionTest.java
docs/user/welcome/upgrade.rst
Bounds 和 Envelopes
Bounds 表示坐标空间中的矩形区域,由每个维度上的最小和最大坐标值定义。Bounds 是许多 GeoTools 操作的基础,包括空间查询、渲染和转换。
Bounds 的主要实现包括:
GeneralBounds: 通用的 n 维边界框实现
ReferencedEnvelope: 与 JTS 兼容的 envelope,同时也实现了 Bounds 接口,允许与 GeoTools 和 JTS 无缝集成
modules/library/main/src/main/java/org/geotools/geometry/jts/ReferencedEnvelope.java
modules/library/referencing/src/main/java/org/geotools/geometry/GeneralBounds.java
modules/library/referencing/src/test/java/org/geotools/geometry/GeneralBoundsTest.java
ReferencedEnvelope: 与 JTS 的桥梁
ReferencedEnvelope 是 GeoTools 中一个特别重要的类,因为它在 GeoTools 空间数据模型和 JTS Topology Suite 之间架起了桥梁。它扩展了 JTS 的 Envelope,同时实现了 GeoTools 的 Bounds 接口。
ReferencedEnvelope 的主要特点:
与 JTS envelope 一起存储坐标参考系统
提供在不同 CRS 之间进行坐标转换的方法
提供从各种源创建 envelope 的工具方法
实现了 GeoTools 的 Bounds 接口和 JTS 的 Envelope,使其成为两个系统之间的多功能桥梁
modules/library/main/src/main/java/org/geotools/geometry/jts/ReferencedEnvelope.java
modules/library/main/src/test/java/org/geotools/geometry/jts/ReferencedEnvelopeTest.java
坐标参考系统
坐标参考系统 (CRS) 是空间数据模型的基础,定义了坐标如何与现实世界位置相关联。在 GeoTools 中,CRS 对象与位置和边界相关联,为坐标提供空间上下文。
空间数据模型中关于 CRS 的要点:
Position 和 Bounds 对象都引用 CRS
CRS 信息对于坐标转换至关重要
CRS 决定了如何解释坐标(例如,纬度/经度 vs. 投影坐标)
当使用不同 CRS 创建位置或边界时,可能需要转换以确保兼容性
modules/library/main/src/main/java/org/geotools/geometry/jts/ReferencedEnvelope.java
modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/factory/epsg/hsql/ThreadedTransformTest.java
在 Grid Coverages 中的使用
空间数据模型在 GeoTools 的 grid coverage 子系统中广泛使用。Grid coverages 使用常规的值网格表示连续现象(如高程或温度),空间数据模型提供了将这些网格与现实世界坐标关联的必要构造。
在 grid coverages 中:
GridGeometry2D将网格范围(像素尺寸)与将像素坐标映射到世界坐标的转换结合- Bounds/ReferencedEnvelope 定义 coverage 的地理范围
- 重投影 grid coverages 时使用坐标转换
空间数据模型允许 grid coverages 被适当地地理参考,支持叠加、子采样和重投影等操作。
- modules/library/coverage/src/main/java/org/geotools/coverage/grid/GridCoverage2D.java
- modules/plugin/coverage-multidim/coverage-api/src/main/java/org/geotools/coverage/io/util/Utilities.java
最近的 API 变更
GeoTools 空间数据模型在 GeoTools 30.x 中经历了重大变更,包括:
- 包重命名,从
org.opengis.geometry到org.geotools.api.geometry - 类重命名,从
DirectPosition到Position - 类重命名,从
Envelope到Bounds - 额外的方法更改和细化
这些变更是为了改进 API 并删除对外部 OpenGIS 包的依赖。
兼容性考虑:
使用旧 API 的代码必须更新以使用新的类和包名
一些方法签名已更改(例如,
ReferencedEnvelope.create()到ReferencedEnvelope.envelope())对 Envelope2D 的 x、y、width、height 的直接字段访问已被适当的 getter 方法替换
docs/user/welcome/upgrade.rst
docs/user/welcome/files/remove-opengis.xml
与 Image Mosaic 的集成
空间数据模型在 ImageMosaic 插件中用于定义图像图块的地理范围。ImageMosaic 使用 ReferencedEnvelope 跟踪镶嵌中每个图像的边界。
在 ImageMosaic 中:
shapefile 索引包含具有关联文件名的 features
每个 feature 有一个几何形状,定义相应图像的边界
ReferencedEnvelope 用于表示具有适当 CRS 信息的这些边界
空间数据模型允许高效查询哪些图像与请求区域相交
docs/user/library/coverage/mosaic.rst
modules/plugin/imagemosaic/src/test/java/org/geotools/gce/imagemosaic/UtilsTest.java
总结
GeoTools 中的空间数据模型通过以下方式为表示地理数据提供了坚实的基础:
- 用于表示坐标空间中点的 Position 类
- 用于表示矩形区域的 Bounds/Envelope 类
- 与坐标参考系统的集成
- 与 JTS 几何形状的兼容性
- 对 grid coverages 的支持
此模型支持许多高级 GeoTools 功能,从数据访问到渲染,并确保在整个库中一致处理空间数据。