图像镶嵌系统
图像镶嵌系统是 GeoTools 中一个强大的模块,能够从多个栅格图像创建无缝镶嵌。它允许用户将众多单独的地理空间图像视为单个虚拟数据集,通过空间、时间和其他维度查询提供高效访问。本页解释了图像镶嵌系统的架构、运行方式及其关键功能。
架构概述
图像镶嵌系统设计为分层架构,组件之间具有清晰的关注点分离。
关键组件
ImageMosaicReader
ImageMosaicReader 是访问镶嵌数据的主要入口点。它实现了 GridCoverage2DReader 接口,充当整个系统的门面。它管理一个或多个 RasterManager 实例,每个 coverage 一个。
public class ImageMosaicReader extends AbstractGridCoverage2DReader implements StructuredGridCoverage2DReader {
Map<String, RasterManager> rasterManagers = new ConcurrentHashMap<>();
GranuleCatalog granuleCatalog;
// ...
}RasterManager
RasterManager 处理镶嵌中的单个 coverage。它管理维度域(时间、高程等),监督查询过程,并协调对图块的访问。
public class RasterManager implements Cloneable {
class SpatialDomainManager {
// 处理空间范围和转换
}
class DomainDescriptor {
// 描述单个域(时间、高程等)
}
GranuleCatalog catalog;
// ...
}GranuleDescriptor
GranuleDescriptor 表示镶嵌的单个部分(图块)。它包含有关图块的元数据以及需要时加载实际栅格数据的方法。
public class GranuleDescriptor {
class GranuleOverviewLevelDescriptor {
// 有关概述级别的信息
}
URL granuleUrl;
ReferencedEnvelope granuleBBOX;
AffineTransform baseGridToWorld;
MultiLevelROI roiProvider;
// ...
}GranuleCatalog
GranuleCatalog 为图块元数据的存储机制提供了抽象。它为不同后端提供了多种实现:
请求/响应周期
从镶嵌读取包括:
RasterLayerRequest: 封装读取操作的参数RasterLayerResponse: 处理请求并生成输出 coverageMosaicProducer: 协调镶嵌的创建SubmosaicProducer: 处理镶嵌的各个部分,可能包括重投影
核心操作
创建镶嵌
创建镶嵌涉及扫描目录中的栅格文件、提取元数据和构建索引。
从镶嵌读取
从镶嵌读取数据涉及:
GranuleDescriptorGranuleCatalogRasterLayerResponseRasterLayerRequestImageMosaicReaderClientGranuleDescriptorGranuleCatalogRasterLayerResponseRasterLayerRequestImageMosaicReaderClient#mermaid-gb7oovqk9zq{font-family:ui-sans-serif,-apple-system,system-ui,Segoe UI,Helvetica;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-gb7oovqk9zq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-gb7oovqk9zq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-gb7oovqk9zq .error-icon{fill:#dddddd;}#mermaid-gb7oovqk9zq .error-text{fill:#222222;stroke:#222222;}#mermaid-gb7oovqk9zq .edge-thickness-normal{stroke-width:1px;}#mermaid-gb7oovqk9zq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-gb7oovqk9zq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-gb7oovqk9zq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-gb7oovqk9zq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-gb7oovqk9zq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-gb7oovqk9zq .marker{fill:#999;stroke:#999;}#mermaid-gb7oovqk9zq .marker.cross{stroke:#999;}#mermaid-gb7oovqk9zq svg{font-family:ui-sans-serif,-apple-system,system-ui,Segoe UI,Helvetica;font-size:16px;}#mermaid-gb7oovqk9zq p{margin:0;}#mermaid-gb7oovqk9zq .actor{stroke:#cccccc;fill:#ffffff;}#mermaid-gb7oovqk9zq text.actor>tspan{fill:#333;stroke:none;}#mermaid-gb7oovqk9zq .actor-line{stroke:#cccccc;}#mermaid-gb7oovqk9zq .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-gb7oovqk9zq .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#999999;}#mermaid-gb7oovqk9zq .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#999999;}#mermaid-gb7oovqk9zq #arrowhead path{fill:#999999;stroke:#999999;}#mermaid-gb7oovqk9zq .sequenceNumber{fill:#666666;}#mermaid-gb7oovqk9zq #sequencenumber{fill:#999999;}#mermaid-gb7oovqk9zq #crosshead path{fill:#999999;stroke:#999999;}#mermaid-gb7oovqk9zq .messageText{fill:#333333;stroke:none;}#mermaid-gb7oovqk9zq .labelBox{stroke:#dddddd;fill:#ffffff;}#mermaid-gb7oovqk9zq .labelText,#mermaid-gb7oovqk9zq .labelText>tspan{fill:#333;stroke:none;}#mermaid-gb7oovqk9zq .loopText,#mermaid-gb7oovqk9zq .loopText>tspan{fill:#333;stroke:none;}#mermaid-gb7oovqk9zq .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#dddddd;fill:#dddddd;}#mermaid-gb7oovqk9zq .note{stroke:#e6d280;fill:#fff5ad;}#mermaid-gb7oovqk9zq .noteText,#mermaid-gb7oovqk9zq .noteText>tspan{fill:#333;stroke:none;}#mermaid-gb7oovqk9zq .activation0{fill:hsl(-120, 0%, 91.7647058824%);stroke:hsl(-120, 0%, 81.7647058824%);}#mermaid-gb7oovqk9zq .activation1{fill:hsl(-120, 0%, 91.7647058824%);stroke:hsl(-120, 0%, 81.7647058824%);}#mermaid-gb7oovqk9zq .activation2{fill:hsl(-120, 0%, 91.7647058824%);stroke:hsl(-120, 0%, 81.7647058824%);}#mermaid-gb7oovqk9zq .actorPopupMenu{position:absolute;}#mermaid-gb7oovqk9zq .actorPopupMenuPanel{position:absolute;fill:#ffffff;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-gb7oovqk9zq .actor-man line{stroke:#cccccc;fill:#ffffff;}#mermaid-gb7oovqk9zq .actor-man circle,#mermaid-gb7oovqk9zq line{stroke:#cccccc;fill:#ffffff;stroke-width:2px;}#mermaid-gb7oovqk9zq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}read(parameters)create requestcreateResponse()processRequest()prepareResponse()getGranuleDescriptors(query)visit(granule)loadRaster()granuleLoadingResultproduce mosaicgridCoveragegridCoverage主要步骤:
- 创建包含参数的请求(bbox、时间、高程等)
- 通过初始化转换和其他设置准备响应
- 查询目录以找到匹配的图块
- 加载每个图块的数据
- 将图块组合成最终的镶嵌
- 应用任何后处理,如透明度处理
多维支持
图像镶嵌系统支持除空间范围之外的多个维度:
| 维度类型 | 描述 | 实现 |
|---|---|---|
| 时间 | 时间序列数据的时间维度 | 目录中的日期/时间戳属性 |
| 高程 | 3D 数据的垂直维度 | 目录中的数字属性 |
| 自定义 | 用户定义的维度 | 图块目录中的任何属性 |
每个维度通过 RasterManager 中的 DomainDescriptor 管理,允许基于这些维度进行过滤和图块选择。
高级功能
异构 CRS 支持
系统可以处理具有不同坐标参考系统的图块:
ReprojectingSubmosaicProducer 处理不同 CRS 图块的即时重投影以匹配目标 CRS。
足迹管理
系统支持足迹处理以定义图块内的有效数据区域:
| 足迹行为 | 描述 |
|---|---|
| None | 无足迹处理,使用整个图块边界 |
| Copy | 按原样使用足迹进行遮罩 |
| Cut | 将图块裁剪到足迹 |
| Transparent | 使足迹外的区域透明 |
足迹可以从以下内容加载:
- 镶嵌目录中的 shapefiles
- WKT (Well-Known Text) 伴随文件
- WKB (Well-Known Binary) 伴随文件
- 图像内部遮罩
性能优化
图像镶嵌系统包括几个性能优化:
缓存机制:
CachingDataStoreGranuleCatalog中的图块描述符缓存QueryCacheGranuleCatalog中的查询结果缓存STRTreeGranuleCatalog中的内存空间索引
多余图块移除:
ROIExcessGranuleRemover消除对最终输出没有贡献的图块- 减少不必要的数据加载和处理
多线程支持:
- 通过
ExecutorService并行图块加载 - 通过
AllowMultithreading参数可配置
- 通过
配置选项
图像镶嵌系统通过参数高度可配置:
| 参数 | 描述 | 默认值 |
|---|---|---|
| MaxAllowedTiles | 要加载的最大图块数 | -1(无限制) |
| BackgroundValues | 用于背景/nodata 的值 | null |
| AllowMultithreading | 启用/禁用多线程 | false |
| FootprintBehavior | 如何处理足迹 | None |
| ExcessGranuleRemoval | 移除多余图块的策略 | NONE |
| SortBy | 图块的排序标准 | null |
| MergeBehavior | 如何合并图块 | FLAT |
| OutputTransparentColor | 输出中变为透明的颜色 | null |
| InputTransparentColor | 输入中变为透明的颜色 | null |
| FILTER | 基于属性过滤图块 | null |
这些参数可以在创建 reader 或读取操作期间指定,以自定义镶嵌的行为。
目录存储选项
图像镶嵌系统为图块目录支持多种后端存储选项:
| 存储类型 | 描述 | 用例 |
|---|---|---|
| Shapefile | 基于文件的索引 | 简单设置,小到中型镶嵌 |
| H2 数据库 | 嵌入式数据库 | 中型镶嵌,额外索引需求 |
| PostGIS | 带有空间扩展的 PostgreSQL | 大型镶嵌,多用户环境 |
| Oracle | Oracle 数据库 | 企业环境 |
| SQL Server | Microsoft SQL Server | 企业环境 |
| 内存中 | STRTree 空间索引 | 临时镶嵌,测试 |
适当的目录可以通过镶嵌目录中的 datastore.properties 文件配置。
使用流程
使用图像镶嵌系统的典型过程包括:
- 创建镶嵌: 组织栅格文件并创建镶嵌目录结构
- 配置索引: 设置 indexer.properties 或 indexer.xml 以定义维度和其他设置
- 初始化 reader: 创建指向镶嵌的 ImageMosaicReader
- 准备参数: 设置用于读取操作的 GeneralParameterValue 对象
- 读取数据: 使用参数调用 read 方法以检索镶嵌的所需子集
此过程通过统一接口实现对大型栅格数据集合的高效访问。