Skip to content

Streaming Renderer ​

Streaming Renderer 是 GeoTools 的主要渲染引擎,能够高效地将地理数据转换为可视化表示。它采用流式处理方式(从数据源检索时逐个处理要素)而不是先将所有数据加载到内存中,使其在处理大数据集时具有内存高效的特点。

本文档记录了 StreamingRenderer 的架构和功能,重点关注其渲染管道、投影处理能力和配置选项。有关相关渲染组件的信息,请参阅 Styling with CSS。

架构概述 ​

StreamingRenderer 实现了 GTRenderer 接口,旨在提供低内存占用的渲染,并且在首次调用时具有不错的性能。它使用流式架构结合多线程方法来实现高效渲染。

SVG
100%

核心组件 ​

StreamingRenderer 类 ​

StreamingRenderer 是核心类,具有以下功能:

  • 处理不同 CRS 之间的坐标转换
  • 以流式方式处理要素以最小化内存使用
  • 管理标签放置和渲染优化
  • 提供线程安全的渲染操作

主要特性:

  • 不支持并发使用的线程安全,但内部使用线程
  • 设计优先考虑低内存占用而非最佳性能
  • 支持高级投影处理
  • 管理各种符号化器(Point, Line, Polygon, Raster, Text)

渲染管道 ​

渲染过程遵循以下步骤:

SVG
100%

多线程处理 ​

渲染器使用多线程方法:

  1. 主线程 - 处理协调并提交渲染请求
  2. 绘制线程 - 处理队列中的渲染请求
  3. 可选线程池 - 可配置为并行处理

PainterThread 从阻塞队列中检索 RenderingRequest 对象。此架构允许主线程在渲染并行进行时继续提交任务。

投影处理系统 ​

StreamingRenderer 最复杂的方面之一是其投影处理系统。

SVG
100%

ProjectionHandler ​

ProjectionHandler 管理坐标转换并处理特殊情况:

  • 裁剪超出投影有效区域的几何图形
  • 处理日期变更线跨越
  • 管理区域扩展以进行正确渲染

它有两个关键的处理阶段:

  1. 预处理 (preProcess) - 在渲染几何图形之前准备它们
  2. 后处理 (postProcess) - 处理渲染后的转换

特殊投影处理器 ​

不同的投影需要专门的处理:

  1. WrappingProjectionHandler - 处理在东西方向环绕的投影,创建连续地图
  2. PolarStereographicHandler - 管理极地投影和极点奇异性
  3. OrthographicProjectionHandler - 处理具有有限可见区域的球形视图投影
  4. HomolosineHandler - 管理具有多个不连续性的中断投影
  5. GeosProjectionHandler - 处理地球静止卫星投影

日期变更线处理 ​

渲染器具有处理 180°/-180° 经线的复杂逻辑:

  1. 当几何图形跨越日期变更线时,它们被适当地分割和包裹
  2. 对于某些投影(例如 Mercator),支持连续包裹
  3. 基于几何图形尺寸和坐标的启发式检测日期变更线跨越

高级功能 ​

几何图形致密化 ​

对于某些投影,弯曲的要素在渲染时可能显示为直线和不准确。StreamingRenderer 可以自动致密化几何图形(添加中间点)以提高视觉质量。

这由 ADVANCED_PROJECTION_DENSIFICATION_KEY 渲染提示控制:

SVG
100%

标签缓存 ​

渲染器使用标签缓存来优化标签放置,避免重叠并提高渲染质量。它支持三种渲染模式:

  • TEXT_RENDERING_STRING - 使用标准文本渲染(更快)
  • TEXT_RENDERING_OUTLINE - 将文本渲染为形状(与光晕更好地对齐)
  • TEXT_RENDERING_ADAPTIVE - 对非水平文本使用轮廓,对水平文本使用字符串(最佳平衡)

包络重投影 ​

EnvelopeReprojector 处理在不同坐标系之间重投影边界框的复杂任务,考虑:

  • 奇异点(极点)
  • 日期变更线跨越
  • 投影有效区域
  • 针对特殊投影的基于象限的扩展

WarpBuilder ​

对于栅格数据,WarpBuilder 创建优化的变换变形,平衡性能和准确性:

  • 分析变换以确定最佳网格大小
  • 创建仿射变换(用于简单变换)或网格变形
  • 处理边缘情况和在图像上具有不同变形的投影

配置和自定义 ​

渲染提示 ​

StreamingRenderer 支持大量渲染提示来自定义行为:

提示键描述默认值
RENDERING_BUFFER渲染区域周围的缓冲区大小0
SCALE_COMPUTATION_METHOD计算比例尺的方法 (SCALE_ACCURATE 或 SCALE_OGC)SCALE_OGC
TEXT_RENDERING_KEY文本渲染模式TEXT_RENDERING_STRING
LINE_WIDTH_OPTIMIZATION_KEY是否优化细线渲染true
OPTIMIZE_FTS_RENDERING_KEY为多个要素类型样式使用内存缓冲区true
ADVANCED_PROJECTION_HANDLING_KEY启用高级投影处理false
CONTINUOUS_MAP_WRAPPING启用连续地图包裹false
VECTOR_RENDERING_KEY优先使用矢量渲染进行填充false
ADVANCED_PROJECTION_DENSIFICATION_KEY启用几何图形致密化false
DATELINE_WRAPPING_HEURISTIC_KEY启用日期变更线包裹检测true

使用示例:

Map<Object, Object> hints = new HashMap<>();
hints.put(StreamingRenderer.ADVANCED_PROJECTION_HANDLING_KEY, true);
hints.put(StreamingRenderer.CONTINUOUS_MAP_WRAPPING, true);
renderer.setRendererHints(hints);

线程池配置 ​

对于并行处理,您可以配置线程池:

StreamingRenderer renderer = new StreamingRenderer();
renderer.setThreadPool(Executors.newFixedThreadPool(4));

错误处理 ​

渲染器提供基于事件错误报告系统:

renderer.addRenderListener(new RenderListener() {
    @Override
    public void featureRenderer(SimpleFeature feature) {
        // 要素成功渲染
    }
    
    @Override
    public void errorOccurred(Exception e) {
        // 处理错误
    }
});

性能考虑 ​

内存与速度权衡 ​

  1. 内存效率:

    • 流式数据访问最小化内存使用
    • 要素简化减少内存占用
    • ScreenMap 优化掉小要素
  2. 性能优化:

    • 投影特定的优化减少计算
    • 标签缓存防止冗余文本操作
    • 多线程并行渲染
  3. 配置提示:

    • 对于大数据集,保持 OPTIMIZE_FTS_RENDERING_KEY 启用
    • 根据几何图形复杂度调整 RENDERING_BUFFER
    • 对于简单投影,考虑禁用 ADVANCED_PROJECTION_HANDLING_KEY

局限性 ​

  • 不支持多线程并发使用的线程安全
  • 对于重复渲染相同数据可能无法获得最佳性能
  • 致密化可能会显著增加几何图形中的顶点数量

与其他组件的集成 ​

StreamingRenderer 与其他几个 GeoTools 组件集成:

  1. Map Content - 提供图层和样式用于渲染
  2. SLD Style Factory - 将 SLD 样式转换为渲染指令
  3. Label Cache - 管理文本放置和渲染
  4. Grid Coverage Renderer - 处理栅格数据渲染
SVG
100%