栅格数据处理
本页记录了 GeoTools 中的栅格数据处理子系统,重点介绍了库如何读取、转换、操作和渲染网格地理空间数据,如卫星影像、航空摄影、数字高程模型和其他形式的栅格数据。有关矢量数据处理的信息,请参阅 矢量数据处理。
概述
GeoTools 通过处理加载、处理和渲染操作的组件集合,为处理栅格数据提供全面支持。栅格数据处理子系统包含几个关键概念:
- GridCoverage - 表示具有地理空间参考的栅格数据的基本数据模型
- 图像处理操作 - 栅格数据的转换、过滤和其他操作
- 镶嵌 - 将多个图像组合成无缝的 coverage
- 重投影 - 在坐标参考系统之间转换
- 渲染 - 使用适当的样式可视化栅格数据
核心组件
GridCoverage2D
GridCoverage2D 是 GeoTools 中栅格数据的核心数据模型。它扩展了 OGC GridCoverage 接口,并通过以下方式将 RenderedImage 与其地理位置相关联:
- 坐标参考系统 (CRS)
- 从网格坐标到世界坐标的转换
- 可选的元数据
此模型允许栅格数据在地理空间中正确定位,支持重投影和与矢量数据集成等操作。
ImageWorker
ImageWorker 类提供了用于对栅格数据应用操作的流式 API。构建在 Java Advanced Imaging (JAI) 之上,它通过操作链简化了复杂的图像处理任务:
ImageWorker 提供的主要操作包括:
| 操作类型 | 示例 | 目的 |
|---|---|---|
| 几何 | scale()、crop()、affine()、warp() | 更改大小和形状 |
| 颜色 | bandSelect()、forceColorSpaceRGB()、forceGrayscale() | 操作颜色空间 |
| 格式 | format()、rescale()、binarize() | 更改数据表示 |
| 统计 | histogram()、getMinimums()、getMaximums() | 计算图像统计信息 |
| 输出 | write()、writePNG()、writeGeoTIFF() | 保存为不同格式 |
GridCoverageReaders
GridCoverage readers 负责将栅格数据从各种源加载到 GridCoverage2D 模型中。架构遵循插件模式,具有格式特定的实现:
readers 处理以下任务:
- 从源文件读取元数据
- 建立坐标参考系统
- 创建网格到世界的转换
- 支持不同比例的高效渲染概述
- 处理多维数据(时间、高程等)
图像处理操作
GeoTools 通过 ImageWorker 类提供广泛的图像处理功能,该类充当 JAI 操作的包装器,同时添加地理空间感知。
常见操作
几何操作
// 将图像缩放到原始大小的 50%
ImageWorker worker = new ImageWorker(sourceImage);
worker.scale(0.5, 0.5, 0, 0);
RenderedImage result = worker.getRenderedImage();颜色转换
// 将 RGB 图像转换为灰度
ImageWorker worker = new ImageWorker(sourceImage);
worker.forceColorSpaceGRAYScale();
RenderedImage result = worker.getRenderedImage();NoData 处理
NoData 值表示没有有效数据的像素。GeoTools 提供了定义和处理这些值的机制:
// 设置 NoData 值并从中创建 ROI
ImageWorker worker = new ImageWorker(sourceImage);
worker.setNoData(RangeFactory.create(-9999, -9999));
worker.setROI(worker.getImageAsROI());图像重投影
重投影将栅格数据从一个坐标参考系统转换到另一个坐标参考系统:
重投影过程涉及:
- 确定源和目标 CRS 之间的数学转换
- 创建应用此转换的扭曲操作
- 使用适当的插值方法重采样图像
- 处理如日期线穿越等边界情况
图像镶嵌系统
图像镶嵌系统是 GeoTools 栅格处理功能最强大的功能之一,允许将多个单独的图像组合成单一无缝的 coverage。
镶嵌架构
关键组件包括:
- ImageMosaicReader - 加载和管理镶嵌的入口点
- RasterManager - 处理镶嵌中特定 coverage 的请求
- GranuleCatalog - 索引并提供对图块(单个图像)的访问
- GranuleDescriptor - 表示单个图块,具有加载它的方法
图块目录
GranuleCatalog 负责索引并提供对图块的高效访问。存在不同的实现:
| 目录类型 | 实现 | 最适合 |
|---|---|---|
| 基于 JDBC | GTDataStoreGranuleCatalog | 具有数据库后端的大型数据集 |
| 内存中 | STRTreeGranuleCatalog | 小到中型数据集 |
| 缓存 | CachingDataStoreGranuleCatalog | 通过缓存提高性能 |
目录支持通过以下内容查询:
- 空间范围(边界框)
- 时间维度
- 高程维度
- 自定义维度
镶嵌处理流水线
当向 ImageMosaicReader 发出请求时,执行以下处理流水线:
此流水线的重要方面包括:
- 图块选择 - 只选择与请求区域相交的图块
- 高效加载 - 只加载所需的图块部分
- 概述支持 - 选择适当的分辨率级别以提高效率
- 异构 CRS - 可以组合不同坐标系统中的图块
- 足迹管理 - 可以使用精确的图块形状代替边界框
渲染系统
渲染系统负责将 GridCoverage 对象转换为视觉表示,应用样式并处理投影问题。
GridCoverageRenderer
GridCoverageRenderer 是负责渲染 GridCoverages 的主要类:
renderer 处理几个复杂的任务:
- 重投影到显示 CRS
- 处理日期线穿越等边界情况
- 全局 coverage 的高级投影处理
- 应用来自 SLD/CSS 的样式
投影处理
跨投影渲染栅格数据提出了几个挑战:
- 日期线穿越 - 处理跨越 180° 经线的图像
- 极地区域 - 管理极地附近的扭曲
- 全球数据 - 正确渲染全球数据集
GeoTools 包括管理这些案例的专门投影处理程序:
ProjectionHandler 框架:
- 确定何时需要特殊处理
- 必要时在日期线周围分割请求
- 管理有效区域的坐标转换
- 重新组合来自多个请求的结果
高级功能
NoData 和 ROI 处理
GeoTools 提供了对 NoData 值(具有无效或缺失数据的像素)和感兴趣区域 (ROIs)的复杂处理:
- NoData 值可以定义为单个值或范围
- ROIs 可以从矢量几何形状或栅格遮罩创建
- 两者都可以通过处理链传播
- 它们可以一起使用以定义有效数据区域
// NoData 和 ROI 处理示例
ImageWorker worker = new ImageWorker(sourceImage);
worker.setNoData(RangeFactory.create(-9999, -9999)); // 设置 NoData 范围
ROIGeometry roiGeometry = new ROIGeometry(geometry); // 从几何形状创建 ROI
worker.setROI(roiGeometry); // 在 worker 上设置 ROI足迹行为
对于图像镶嵌,足迹定义了每个图块的确切形状,允许精确控制哪些部分贡献于最终镶嵌:
| 足迹模式 | 行为 |
|---|---|
| None | 使用每个图块的完整边界框 |
| Cut | 将图块裁剪到其足迹边界 |
| Transparent | 使足迹外的区域透明 |
足迹可以定义为:
- 目录中存储的矢量几何形状
- 从数据本身派生的栅格遮罩
- 基于有效数据区域即时计算
多线程处理
GeoTools 在栅格处理的几个方面利用多线程:
- 并行图块加载 - 可以同时加载多个图块
- JAI TileScheduler - 图块的并行处理
- 并发渲染 - 多个渲染操作可以并行进行
// 配置多线程示例
Hints hints = new Hints();
ExecutorService threadPool = Executors.newFixedThreadPool(4);
hints.put(Hints.EXECUTOR_SERVICE, threadPool);
ImageMosaicReader reader = new ImageMosaicReader(source, hints);线程模型通过提示可配置,允许应用程序根据其需求控制资源使用。
结论
GeoTools 的栅格数据处理系统为处理地理空间栅格数据提供了一套全面的工具。从基本操作到高级功能如镶嵌和足迹管理,该库支持地理空间应用的广泛用例。
通过专门用于读取、处理和渲染的组件的模块化设计,实现了灵活性和可扩展性,同时在不同的栅格数据格式和处理需求中保持一致的 API。