Skip to content

图像镶嵌系统 ​

图像镶嵌系统是 GeoTools 中一个强大的模块,能够从多个栅格图像创建无缝镶嵌。它允许用户将众多单独的地理空间图像视为单个虚拟数据集,通过空间、时间和其他维度查询提供高效访问。本页解释了图像镶嵌系统的架构、运行方式及其关键功能。

架构概述 ​

图像镶嵌系统设计为分层架构,组件之间具有清晰的关注点分离。

SVG
100%

关键组件 ​

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 为图块元数据的存储机制提供了抽象。它为不同后端提供了多种实现:

SVG
100%

请求/响应周期 ​

从镶嵌读取包括:

  • RasterLayerRequest: 封装读取操作的参数
  • RasterLayerResponse: 处理请求并生成输出 coverage
  • MosaicProducer: 协调镶嵌的创建
  • SubmosaicProducer: 处理镶嵌的各个部分,可能包括重投影

核心操作 ​

创建镶嵌 ​

创建镶嵌涉及扫描目录中的栅格文件、提取元数据和构建索引。

SVG
100%

从镶嵌读取 ​

从镶嵌读取数据涉及:

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

主要步骤:

  1. 创建包含参数的请求(bbox、时间、高程等)
  2. 通过初始化转换和其他设置准备响应
  3. 查询目录以找到匹配的图块
  4. 加载每个图块的数据
  5. 将图块组合成最终的镶嵌
  6. 应用任何后处理,如透明度处理

多维支持 ​

图像镶嵌系统支持除空间范围之外的多个维度:

维度类型描述实现
时间时间序列数据的时间维度目录中的日期/时间戳属性
高程3D 数据的垂直维度目录中的数字属性
自定义用户定义的维度图块目录中的任何属性

每个维度通过 RasterManager 中的 DomainDescriptor 管理,允许基于这些维度进行过滤和图块选择。

高级功能 ​

异构 CRS 支持 ​

系统可以处理具有不同坐标参考系统的图块:

SVG
100%

ReprojectingSubmosaicProducer 处理不同 CRS 图块的即时重投影以匹配目标 CRS。

足迹管理 ​

系统支持足迹处理以定义图块内的有效数据区域:

足迹行为描述
None无足迹处理,使用整个图块边界
Copy按原样使用足迹进行遮罩
Cut将图块裁剪到足迹
Transparent使足迹外的区域透明

足迹可以从以下内容加载:

  • 镶嵌目录中的 shapefiles
  • WKT (Well-Known Text) 伴随文件
  • WKB (Well-Known Binary) 伴随文件
  • 图像内部遮罩

性能优化 ​

图像镶嵌系统包括几个性能优化:

  1. 缓存机制:

    • CachingDataStoreGranuleCatalog 中的图块描述符缓存
    • QueryCacheGranuleCatalog 中的查询结果缓存
    • STRTreeGranuleCatalog 中的内存空间索引
  2. 多余图块移除:

    • ROIExcessGranuleRemover 消除对最终输出没有贡献的图块
    • 减少不必要的数据加载和处理
  3. 多线程支持:

    • 通过 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大型镶嵌,多用户环境
OracleOracle 数据库企业环境
SQL ServerMicrosoft SQL Server企业环境
内存中STRTree 空间索引临时镶嵌,测试

适当的目录可以通过镶嵌目录中的 datastore.properties 文件配置。

使用流程 ​

使用图像镶嵌系统的典型过程包括:

  1. 创建镶嵌: 组织栅格文件并创建镶嵌目录结构
  2. 配置索引: 设置 indexer.properties 或 indexer.xml 以定义维度和其他设置
  3. 初始化 reader: 创建指向镶嵌的 ImageMosaicReader
  4. 准备参数: 设置用于读取操作的 GeneralParameterValue 对象
  5. 读取数据: 使用参数调用 read 方法以检索镶嵌的所需子集

此过程通过统一接口实现对大型栅格数据集合的高效访问。