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;
}
这将导致以下输出:

栅格输出,点尚未点击¶

矢量输出,点可点击,并绘制为较大的图标。¶
关于上面的CSS,有一点很重要,那就是规则的顺序很重要。CSS-to-SLD转换器使用特定性来决定哪个规则覆盖另一个规则,并且在编写时,该特定性仅由缩放规则和对属性的访问来驱动。过滤器使用 kmlOutputMode
过滤器实际上没有使用任何特性属性,因此它与catch all具有相同的特性 :mark
规则。将它放在第一位可以确保它以任何方式覆盖catch all规则,而将它放在第二位则会导致输出大小始终为4。
获取与旧的kml编码器类似的kml标记¶
旧的kml生成器(在geoserver 2.4之前)无法真正尊重标记自身的形状,因此,只需将标记颜色应用于固定的类似靶心的图标,例如:

从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输出:
