设置混合几何图形类型的样式

有时,可能需要为几何图形列设置样式,该列的几何图形类型对于每个特征都可以是不同的(一些是多边形,一些是点等),并对不同的几何图形类型使用不同的样式。

SLD 1.0不提供解决这种情况的干净解决方案。点、线和多边形符号不按类型选择几何图形,因为每个符号都可以应用于所有几何图形类型:

  • 点符号适用于任何类型的几何图形。如果几何图形不是点,则使用几何图形的质心。

  • 线条符号适用于线条和多边形。对于多边形,边界是样式化的。

  • 多边形符号应用于线条,通过添加连接线条第一点和最后一点的闭合段。

也没有标准的过滤器谓词来标识可以在规则中使用的几何类型。

本节介绍了按几何类型完成样式设置的多种方法。它们需要数据重组或使用非标准的过滤函数。

重组数据

有几种方法可以重新构造数据,以便仅使用标准的SLD构造按几何类型对其进行样式化。

拆分表格

第一个也是显而易见的一个方法是将原始表拆分为一组单独的表,每个表包含一个几何类型。例如,if table findings 有一个可以包含点、线和多边形的几何列,可以创建三个表,每个表包含一个几何类型。

分离几何列

第二种方法是使用一个表和单独的几何列。所以,如果桌子 findings 有一个 geom 列,重新构造的表将 pointlinepolygon 列,每个列只包含一种几何类型。重组后,符号将指向特定的几何图形,例如:

<PolygonSymbolizer>
    <Geometry><ogc:PropertyName>polygon</ogc:PropertyName></Geometry>
</PolygonSymbolizer>

这样,每个符号将只匹配它应该呈现的几何体类型,并跳过包含空值的行。

添加几何类型列

第三种方法是添加一个允许使用标准过滤构造的几何类型列,然后为每个几何类型构建一个单独的规则。在上面的示例中,一个新属性, gtype 将添加包含值的 PointLinePolygon .更改后可以使用以下SLD模板:

<Rule>
   <ogc:Filter>
      <ogc:PropertyIsEqualTo>
         <ogc:PropertyName>gtype</ogc:PropertyName>
         <ogc:Literal>Point</ogc:Literal>
      </ogc:PropertyIsEqualTo>
   </ogc:Filter>
   <PointSymbolizer>
      ...
   </PointSymbolizer>
</Rule>
<Rule>
   <ogc:Filter>
      <ogc:PropertyIsEqualTo>
         <ogc:PropertyName>gtype</ogc:PropertyName>
         <ogc:Literal>Line</ogc:Literal>
      </ogc:PropertyIsEqualTo>
   </ogc:Filter>
   <LineSymbolizer>
      ...
   </LineSymbolizer>
</Rule>
<Rule>
   <ogc:Filter>
      <ogc:PropertyIsEqualTo>
         <ogc:PropertyName>gtype</ogc:PropertyName>
         <ogc:Literal>Polygon</ogc:Literal>
      </ogc:PropertyIsEqualTo>
   </ogc:Filter>
   <PolygonSymbolizer>
      ...
   </PolygonSymbolizer>
</Rule>

上述建议假设重组数据在技术上是可行的。在提供允许确定几何类型的函数的空间数据库中,这通常是正确的。

创建视图

在不改变表结构的情况下获得相同结果的一种入侵性较小的方法是创建具有所需结构的视图。这样可以保持原始数据的完整性,并且可以使用视图进行渲染。

使用SLD规则和过滤功能

sld 1.0使用ogc filter1.0规范过滤出每个规则要设置样式的数据。筛选器可以包含 过滤器功能 计算几何值的性质。在geoserver中,可以使用 geometryTypedimension 过滤功能。

备注

过滤器编码规范为过滤器函数提供了一种标准语法,但不要求指定一组特定的函数。使用这些功能的SLD可能无法移植到其他样式软件。

几何类型函数

这个 geometryType 函数接受一个几何属性并返回一个字符串,该字符串(当前)是其中一个值 PointLineStringLinearRingPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection .

使用此函数,a Rule 仅匹配单点可写为:

<Rule>
   <ogc:PropertyIsEqualTo>
      <ogc:Function name="geometryType">
         <ogc:PropertyName>geom</ogc:PropertyName>
      </ogc:Function>
      <ogc:Literal>Point</ogc:Literal>
   </ogc:PropertyIsEqualTo>
   <PointSymbolizer>
     ...
   </PointSymbolizer>
</Rule>

如果必须匹配所有线性几何体类型,则过滤器更复杂。在这种情况下,它看起来像:

<Rule>
   <ogc:Filter>
     <ogc:PropertyIsEqualTo>
       <ogc:Function name="in3">
          <ogc:Function name="geometryType">
              <ogc:PropertyName>geom</ogc:PropertyName>
          </ogc:Function>
          <ogc:Literal>LineString</ogc:Literal>
          <ogc:Literal>LinearRing</ogc:Literal>
          <ogc:Literal>MultiLineString</ogc:Literal>
       </ogc:Function>
       <ogc:Literal>true</ogc:Literal>
     </ogc:PropertyIsEqualTo>
   </ogc:Filter>
   <LineSymbolizer>
     ...
   </LineSymbolizer>
</Rule>

此筛选器被读取为 geometryType(geom) in ("LineString", "LinearRing", "MultiLineString") .过滤器1.0中的过滤器函数具有固定数量的参数,因此有一系列 in 其名称与接受的参数数目相对应的函数: in2in3in10 .

维数函数

一个稍微简单的选择是使用几何图形 dimension 函数选择所需尺寸的几何图形。尺寸0选择点和多点,尺寸1选择线串、线槽和多线槽,尺寸2选择多边形和多多边形。以下示例显示如何选择线性几何图形:

<Rule>
   <ogc:PropertyIsEqualTo>
      <ogc:Function name="dimension">
         <ogc:PropertyName>geom</ogc:PropertyName>
      </ogc:Function>
      <ogc:Literal>1</ogc:Literal>
   </ogc:PropertyIsEqualTo>
   <LineSymbolizer>
     ...
   </LineSymbolizer>
</Rule>