问题描述
如何通过 SLD 为一个记录定义集合中对象的样式。例如,线是分开的,多边形是分开的。
例如
<Rule>
<ogc:PropertyIsEqualTo>
<ogc:Function name="geometryType">
<ogc:PropertyName>geom</ogc:PropertyName>
</ogc:Function>
<ogc:Literal>GeometryCollection</ogc:Literal>
</ogc:PropertyIsEqualTo>
<polygonSymbolizer> -- ONLY POLIGON
...
</polygonSymbolizer>
<Linesymbolizer> -- ONLY LInes
...
</Linesymbolizer>
</Rule>
到目前为止,事实证明第一种样式用于录制的所有子对象,并且线条显示为多边形。 https://i.stack.imgur.com/RoHBZ.png
解决方法
Rule
会将其所有 Symbolizer
应用于与其过滤器匹配的所有特征,因此此 SLD 的行为完全符合预期。
您需要有多个带有不同过滤器的规则:
<Rule>
<ogc:PropertyIsEqualTo>
<ogc:Function name="geometryType">
<ogc:PropertyName>geom</ogc:PropertyName>
</ogc:Function>
<ogc:Literal>Polygon</ogc:Literal>
</ogc:PropertyIsEqualTo>
<PolygonSymbolizer> -- ONLY POLIGON
...
</PolygonSymbolizer>
</Rule>
<Rule>
<ogc:PropertyIsEqualTo>
<ogc:Function name="geometryType">
<ogc:PropertyName>geom</ogc:PropertyName>
</ogc:Function>
<ogc:Literal>LineString</ogc:Literal>
</ogc:PropertyIsEqualTo>
<LineSymbolizer> -- ONLY LINES
...
</LineSymbolizer>
</Rule>
GeoServer manual 中有更多详细信息,但是,这些技术都不适用于 GeometryCollection
,因此您可能需要重新设计数据流以避免以这些方式结束。