Skip to content

渲染系统 ​

GeoTools 中的渲染系统提供了将地理数据转换为视觉表示的框架。该系统处理将样式应用于 features、管理坐标转换、优化渲染性能以及解决日期线穿越等特殊情况的复杂任务。

概述 ​

GeoTools 的渲染系统构建在流式架构周围,该架构处理直接来自数据源的 features 而不是首先将所有内容加载到内存。这种方法实现了高效渲染大型数据集,同时保持低内存占用。

SVG
100%

StreamingRenderer ​

渲染系统的核心是 StreamingRenderer 类,它实现了 GTRenderer 接口。它设计为:

  • 处理从数据源流式传输的 features
  • 保持低内存占用
  • 应用坐标转换
  • 处理样式应用
  • 管理文本和标签放置

架构 ​

StreamingRenderer 使用并行处理架构:

SVG
100%

渲染提示 ​

renderer 的行为可以使用渲染提示自定义:

提示键描述默认值
ADVANCED_PROJECTION_HANDLING_KEY启用高级投影处理false
CONTINUOUS_MAP_WRAPPING启用连续地图包装false
TEXT_RENDERING_KEY控制文本渲染方法STRING
OPTIMIZE_FTS_RENDERING_KEYfeature 样式渲染的内存/速度权衡true
VECTOR_RENDERING_KEY为图形填充启用矢量渲染false
SCALE_COMPUTATION_METHOD_KEY计算比例尺的方法(OGC、ACCURATE)"OGC"
RENDERING_BUFFER请求区域周围的缓冲区(像素)0
DPI_KEY输出设备的 DPI90

渲染过程 ​

渲染过程遵循以下步骤:

SVG
100%

投影处理系统 ​

投影处理系统管理坐标转换并解决日期线穿越和极点奇点等问题。

ProjectionHandler ​

ProjectionHandler 类为以下内容提供基本功能:

  • 在坐标系统之间转换几何形状
  • 处理投影中的奇点
  • 优化查询 envelope
  • 预处理和后处理几何形状
SVG
100%

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 创建优化的转换对象:

  • 构建复杂转换的基于网格的近似值
  • 使用递归细分确定最佳网格大小
  • 在指定公差内保持准确性
  • 对仿射转换实现特殊优化

样式系统 ​

样式系统决定了地理要素的视觉表示方式。

样式结构 ​

SVG
100%

CSS 支持 ​

GeoTools 提供 CSS 样式支持作为 SLD 的替代:

  1. CssParser: 将 CSS 语法解析为 Stylesheet 对象
  2. CssTranslator: 将 Stylesheet 转换为 SLD/Style 对象
SVG
100%

要转换为 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);