渲染系统
GeoTools 中的渲染系统提供了将地理数据转换为视觉表示的框架。该系统处理将样式应用于 features、管理坐标转换、优化渲染性能以及解决日期线穿越等特殊情况的复杂任务。
概述
GeoTools 的渲染系统构建在流式架构周围,该架构处理直接来自数据源的 features 而不是首先将所有内容加载到内存。这种方法实现了高效渲染大型数据集,同时保持低内存占用。
StreamingRenderer
渲染系统的核心是 StreamingRenderer 类,它实现了 GTRenderer 接口。它设计为:
- 处理从数据源流式传输的 features
- 保持低内存占用
- 应用坐标转换
- 处理样式应用
- 管理文本和标签放置
架构
StreamingRenderer 使用并行处理架构:
渲染提示
renderer 的行为可以使用渲染提示自定义:
| 提示键 | 描述 | 默认值 |
|---|---|---|
ADVANCED_PROJECTION_HANDLING_KEY | 启用高级投影处理 | false |
CONTINUOUS_MAP_WRAPPING | 启用连续地图包装 | false |
TEXT_RENDERING_KEY | 控制文本渲染方法 | STRING |
OPTIMIZE_FTS_RENDERING_KEY | feature 样式渲染的内存/速度权衡 | true |
VECTOR_RENDERING_KEY | 为图形填充启用矢量渲染 | false |
SCALE_COMPUTATION_METHOD_KEY | 计算比例尺的方法(OGC、ACCURATE) | "OGC" |
RENDERING_BUFFER | 请求区域周围的缓冲区(像素) | 0 |
DPI_KEY | 输出设备的 DPI | 90 |
渲染过程
渲染过程遵循以下步骤:
投影处理系统
投影处理系统管理坐标转换并解决日期线穿越和极点奇点等问题。
ProjectionHandler
ProjectionHandler 类为以下内容提供基本功能:
- 在坐标系统之间转换几何形状
- 处理投影中的奇点
- 优化查询 envelope
- 预处理和后处理几何形状
WrappingProjectionHandler
WrappingProjectionHandler 是一个专门的处理器,通过以下方式启用类似 Google Maps 的连续地图显示:
- 在日期线周围复制几何形状
- 支持无限滚动的"世界包装"
- 提供跨 -180°/180° 边界的无缝显示
// 应用程序代码中的配置示例
Map<String, Object> hints = new HashMap<>();
hints.put(StreamingRenderer.ADVANCED_PROJECTION_HANDLING_KEY, true);
hints.put(StreamingRenderer.CONTINUOUS_MAP_WRAPPING, true);
renderer.setRendererHints(hints);WarpBuilder
WarpBuilder 创建优化的转换对象:
- 构建复杂转换的基于网格的近似值
- 使用递归细分确定最佳网格大小
- 在指定公差内保持准确性
- 对仿射转换实现特殊优化
样式系统
样式系统决定了地理要素的视觉表示方式。
样式结构
CSS 支持
GeoTools 提供 CSS 样式支持作为 SLD 的替代:
- CssParser: 将 CSS 语法解析为
Stylesheet对象 - CssTranslator: 将
Stylesheet转换为 SLD/Style 对象
要转换为 Style 的 CSS 示例:
/* CSS 样式 */
* {
fill: #9999cc;
stroke: #000000;
stroke-width: 0.5;
}
[population > 100000] {
fill: #cc3333;
}// 将 CSS 转换为 Style 的 Java 代码
Stylesheet ss = CssParser.parse(css);
CssTranslator translator = new CssTranslator();
Style style = translator.translate(ss);高级功能
标签缓存
renderer 使用标签缓存以优化标签放置:
- 在渲染过程中收集所有标签
- 应用冲突解决以避免重叠
- 支持不同的文本渲染模式:
TEXT_RENDERING_STRING: 使用标准文本方法的快速渲染TEXT_RENDERING_OUTLINE: 使用矢量轮廓的精确文本+halo 居中TEXT_RENDERING_ADAPTIVE: 非水平文本使用轮廓,水平文本使用字符串的混合模式(最佳质量)
多线程渲染
renderer 支持并行处理:
// 设置线程池
ExecutorService threadPool = Executors.newFixedThreadPool(4);
renderer.setThreadPool(threadPool);集成示例
渲染流水线的完整示例:
// 使用图层创建地图内容
MapContent map = new MapContent();
map.addLayer(new FeatureLayer(featureSource, style));
// 配置 renderer
StreamingRenderer renderer = new StreamingRenderer();
Map<String, Object> hints = new HashMap<>();
hints.put(StreamingRenderer.ADVANCED_PROJECTION_HANDLING_KEY, true);
hints.put(StreamingRenderer.CONTINUOUS_MAP_WRAPPING, true);
renderer.setRendererHints(hints);
renderer.setMapContent(map);
// 设置输出
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = image.createGraphics();
// 渲染
ReferencedEnvelope bounds = featureSource.getBounds();
renderer.paint(graphics, new Rectangle(width, height), bounds);