Streaming Renderer
Streaming Renderer 是 GeoTools 的主要渲染引擎,能够高效地将地理数据转换为可视化表示。它采用流式处理方式(从数据源检索时逐个处理要素)而不是先将所有数据加载到内存中,使其在处理大数据集时具有内存高效的特点。
本文档记录了 StreamingRenderer 的架构和功能,重点关注其渲染管道、投影处理能力和配置选项。有关相关渲染组件的信息,请参阅 Styling with CSS。
架构概述
StreamingRenderer 实现了 GTRenderer 接口,旨在提供低内存占用的渲染,并且在首次调用时具有不错的性能。它使用流式架构结合多线程方法来实现高效渲染。
核心组件
StreamingRenderer 类
StreamingRenderer 是核心类,具有以下功能:
- 处理不同 CRS 之间的坐标转换
- 以流式方式处理要素以最小化内存使用
- 管理标签放置和渲染优化
- 提供线程安全的渲染操作
主要特性:
- 不支持并发使用的线程安全,但内部使用线程
- 设计优先考虑低内存占用而非最佳性能
- 支持高级投影处理
- 管理各种符号化器(Point, Line, Polygon, Raster, Text)
渲染管道
渲染过程遵循以下步骤:
多线程处理
渲染器使用多线程方法:
- 主线程 - 处理协调并提交渲染请求
- 绘制线程 - 处理队列中的渲染请求
- 可选线程池 - 可配置为并行处理
PainterThread 从阻塞队列中检索 RenderingRequest 对象。此架构允许主线程在渲染并行进行时继续提交任务。
投影处理系统
StreamingRenderer 最复杂的方面之一是其投影处理系统。
ProjectionHandler
ProjectionHandler 管理坐标转换并处理特殊情况:
- 裁剪超出投影有效区域的几何图形
- 处理日期变更线跨越
- 管理区域扩展以进行正确渲染
它有两个关键的处理阶段:
- 预处理 (
preProcess) - 在渲染几何图形之前准备它们 - 后处理 (
postProcess) - 处理渲染后的转换
特殊投影处理器
不同的投影需要专门的处理:
- WrappingProjectionHandler - 处理在东西方向环绕的投影,创建连续地图
- PolarStereographicHandler - 管理极地投影和极点奇异性
- OrthographicProjectionHandler - 处理具有有限可见区域的球形视图投影
- HomolosineHandler - 管理具有多个不连续性的中断投影
- GeosProjectionHandler - 处理地球静止卫星投影
日期变更线处理
渲染器具有处理 180°/-180° 经线的复杂逻辑:
- 当几何图形跨越日期变更线时,它们被适当地分割和包裹
- 对于某些投影(例如 Mercator),支持连续包裹
- 基于几何图形尺寸和坐标的启发式检测日期变更线跨越
高级功能
几何图形致密化
对于某些投影,弯曲的要素在渲染时可能显示为直线和不准确。StreamingRenderer 可以自动致密化几何图形(添加中间点)以提高视觉质量。
这由 ADVANCED_PROJECTION_DENSIFICATION_KEY 渲染提示控制:
标签缓存
渲染器使用标签缓存来优化标签放置,避免重叠并提高渲染质量。它支持三种渲染模式:
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) {
// 处理错误
}
});性能考虑
内存与速度权衡
内存效率:
- 流式数据访问最小化内存使用
- 要素简化减少内存占用
- ScreenMap 优化掉小要素
性能优化:
- 投影特定的优化减少计算
- 标签缓存防止冗余文本操作
- 多线程并行渲染
配置提示:
- 对于大数据集,保持
OPTIMIZE_FTS_RENDERING_KEY启用 - 根据几何图形复杂度调整
RENDERING_BUFFER - 对于简单投影,考虑禁用
ADVANCED_PROJECTION_HANDLING_KEY
- 对于大数据集,保持
局限性
- 不支持多线程并发使用的线程安全
- 对于重复渲染相同数据可能无法获得最佳性能
- 致密化可能会显著增加几何图形中的顶点数量
与其他组件的集成
StreamingRenderer 与其他几个 GeoTools 组件集成:
- Map Content - 提供图层和样式用于渲染
- SLD Style Factory - 将 SLD 样式转换为渲染指令
- Label Cache - 管理文本放置和渲染
- Grid Coverage Renderer - 处理栅格数据渲染