KML

KML中栅格到矢量切换的检测

geoserver 2.4添加了一个新的图标服务器,KML输出使用该服务器来确保点符号器看起来与正常WMS调用中的符号器相同,无论它们的显示比例如何。

当在默认的kml生成模式下工作时,这可能会造成一些问题,在这种模式下,地图是一个达到一定比例的地面覆盖层,并且一旦可视化中的特征数量低于一定比例(由 KMSCORE 参数):不会以“视觉”方式通知最终用户发生了切换。

但是,有一个由KML生成器设置的自定义环境变量,样式可以利用该变量来了解KML生成是以地面覆盖模式还是以矢量模式发生。

以下示例利用此函数在点可单击时显示较大的点符号:

* {
  mark: symbol("circle");
}

:mark [env('kmlOutputMode') = 'vector'] {
  size: 8;
}

:mark {
  size: 4;
  fill: yellow;
  stroke: black;
}

这将导致以下输出:

../../../_images/kml-raster.png

栅格输出,点尚未点击

../../../_images/kml-vector.png

矢量输出,点可点击,并绘制为较大的图标。

关于上面的CSS,有一点很重要,那就是规则的顺序很重要。CSS-to-SLD转换器使用特定性来决定哪个规则覆盖另一个规则,并且在编写时,该特定性仅由缩放规则和对属性的访问来驱动。过滤器使用 kmlOutputMode 过滤器实际上没有使用任何特性属性,因此它与catch all具有相同的特性 :mark 规则。将它放在第一位可以确保它以任何方式覆盖catch all规则,而将它放在第二位则会导致输出大小始终为4。

获取与旧的kml编码器类似的kml标记

旧的kml生成器(在geoserver 2.4之前)无法真正尊重标记自身的形状,因此,只需将标记颜色应用于固定的类似靶心的图标,例如:

../../../_images/legacy-kml-marks.png

从geoserver 2.4开始,kml引擎已经被重写,除其他外,它可以生成标记的精确表示,不仅要考虑颜色,还要考虑形状和笔划。但是,如果想要重现旧的输出外观,该怎么办?

解决方案是利用尊重标记外观到字母的能力,并结合两个重叠的标记来生成所需的输出:

* {
  mark: symbol('circle'), symbol('circle');
  mark-size: 12, 4;
}

:nth-mark(1) {
  fill: red;
  stroke: black;
  stroke-width: 2;
}

:nth-mark(2) {
  fill: black;
}

从而产生以下Google Earth输出:

../../../_images/kml-eyesbull-mark.png
Next: 其他