SLD中的几何变换

SLD符号可以包含可选的 <Geometry> 元素,该元素允许指定要呈现的几何体属性。在具有单个几何属性的FeatureType的常见情况下,此元素通常被省略,但当FeatureType具有多个几何值属性时,此元素非常有用。

SLD 1.0需要 <Geometry> 要成为的内容 <ogc:PropertyName> .geoserver对此进行了扩展,以允许使用常规的sld表达式。表达式可以包含过滤函数,这些函数通过将几何图形转换为不同的内容来操作几何图形。这个设施叫SLD 几何变换 .

geoserver提供了许多可以转换几何体的过滤函数。完整的列表可在 过滤函数引用 .它们可以用于执行诸如提取线顶点或端点、偏移多边形或缓冲几何体等操作。

在执行对输出地图的任何重投影和重缩放之前,几何体转换在几何体的原始坐标参考系统中进行计算。因此,转换参数必须以几何CRS的单位表示。在不同屏幕比例下使用几何变换时,必须考虑到这一点,因为参数不会随比例变化。

实例

让我们看一些例子。

提取顶点

下面是一个示例,它允许提取几何体的所有顶点,并使用 vertices 功能:

 1   <PointSymbolizer>
 2     <Geometry>
 3       <ogc:Function name="vertices">
 4          <ogc:PropertyName>the_geom</ogc:PropertyName>
 5       </ogc:Function>
 6     </Geometry>
 7     <Graphic>
 8       <Mark>
 9         <WellKnownName>square</WellKnownName>
10         <Fill>
11           <CssParameter name="fill">#FF0000</CssParameter>
12         </Fill>
13       </Mark>
14       <Size>6</Size>
15     </Graphic>
16  </PointSymbolizer>

View the full "Vertices" SLD

应用于样品 tasmania_roads 层,这将导致:

../../../_images/vertices.png

从几何体中提取和显示顶点

起点和终点

这个 startPointendPoint 函数可用于提取线条的起点和终点。

 1<PointSymbolizer>
 2  <Geometry>
 3    <ogc:Function name="startPoint">
 4      <ogc:PropertyName>the_geom</ogc:PropertyName>
 5    </ogc:Function>
 6  </Geometry>
 7  <Graphic>
 8    <Mark>
 9      <WellKnownName>square</WellKnownName>
10      <Stroke>
11        <CssParameter name="stroke">0x00FF00</CssParameter>
12        <CssParameter name="stroke-width">1.5</CssParameter>
13      </Stroke>
14    </Mark>
15    <Size>8</Size>
16  </Graphic>
17 </PointSymbolizer>
18 <PointSymbolizer>
19   <Geometry>
20     <ogc:Function name="endPoint">
21       <ogc:PropertyName>the_geom</ogc:PropertyName>
22     </ogc:Function>
23   </Geometry>
24   <Graphic>
25     <Mark>
26       <WellKnownName>circle</WellKnownName>
27       <Fill>
28          <CssParameter name="fill">0xFF0000</CssParameter>
29       </Fill>
30     </Mark>
31     <Size>4</Size>
32   </Graphic>
33 </PointSymbolizer>

View the full "StartEnd" SLD

应用于样品 tasmania_roads 层,这将导致:

../../../_images/startend.png

提取线条的起点和终点

放置阴影

这个 offset 函数可用于在多边形下方创建放置阴影效果。请注意,偏移值反映了这样一个事实:示例中使用的数据位于地理坐标系中。

 1  <PolygonSymbolizer>
 2    <Geometry>
 3       <ogc:Function name="offset">
 4          <ogc:PropertyName>the_geom</ogc:PropertyName>
 5          <ogc:Literal>0.00004</ogc:Literal>
 6          <ogc:Literal>-0.00004</ogc:Literal>
 7       </ogc:Function>
 8    </Geometry>
 9    <Fill>
10      <CssParameter name="fill">#555555</CssParameter>
11    </Fill>
12  </PolygonSymbolizer>

View the full "Shadow" SLD

应用于样品 tasmania_roads 层,这将导致:

../../../_images/shadow.png

删除建筑阴影

性能提示

geoserver的过滤函数包含许多与集合相关的或构造性的几何函数,例如 bufferintersectiondifference 以及其他。这些可以用作几何转换,但在CPU消耗方面,它们可能很重,因此建议小心使用它们。一种策略是只在更高的缩放级别激活它们,这样处理的特性就更少了。

缓冲通常可以通过使用非常大的笔画以及圆线连接和线帽进行视觉近似。这避免了实际几何缓冲区转换的性能成本。

添加新转换

附加的过滤函数可以在Java中开发,然后作为一个GeoServer插件部署在一个JAR文件中。目前没有可用的指南,但请参阅地理工具 main 示例模块。