在单个FeatureTypeStyle中启用z排序¶
z-ordering是作为一个新的featuretypestyle供应商选项实现的, sortBy
控制从数据源中提取特征的顺序,从而绘制。这个 sortBy
语法与WFS ONE相同,即逗号分隔的字段名列表,带有可选的方向修饰符(默认值为升序)::
field1 [A|D], field2 [A|D], ... , fieldN [A|D]
一些例子:
“Z”:根据
z
字段,升序(先绘制较低的Z值,后绘制较高的Z值)“cat,z d”:对
cat
属性,按升序排列,对于具有相同属性的cat
值,排序为降序z
“cat d,z d”:对
cat
属性,按降序排列,对于具有相同属性的cat
值,排序为降序z
因此,如果我们想基于单个“提升”属性订购功能,我们将使用以下SLD片段:
...
<sld:FeatureTypeStyle>
<sld:Rule>
...
<!-- filters and symbolizers here -->
...
</sld:Rule>
<sld:VendorOption name="sortBy">elevation</sld:VendorOption>
</sld:FeatureTypeStyle>
...
跨FeatureTypeStyle的Z排序¶
针对复杂的道路网络执行道路套管是一种常见的需求,该网络可以有自己的Z顺序需求(例如,通过和通过)。套管通常使用两个单独的两个 FeatureTypeStyle
一条画粗线,一条画细线。
让我们考虑一个简单的数据集,它只由三条路组成:
_=geom:LineString:404000,z:int
Line.1=LINESTRING(0 4, 10 4)|1
Line.2=LINESTRING(0 6, 10 6)|3
Line.3=LINESTRING(7 0, 7 10)|1
向两者添加“sortby”规则 FeatureTypeStyle
对象将无法获得可见的结果:
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a named layer is the basic building block of an sld document -->
<NamedLayer>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">8</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<sld:VendorOption name="sortBy">z</sld:VendorOption>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FFFFFF</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<sld:VendorOption name="sortBy">z</sld:VendorOption>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
结果如下:

这是因为当道路按正确的顺序装载时, Line.1,Line.3,Line.2
,它们都是先用勾选链接绘制的,然后代码将重新开始,并用细线绘制它们。
为了让套管和Z-订购都能使用新的供应商选项, sortByGroup
,需要同时添加到 FeatureTypeStyle
,将它们分组在一个Z顺序的油漆中。
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a named layer is the basic building block of an sld document -->
<NamedLayer>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">8</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<sld:VendorOption name="sortBy">z</sld:VendorOption>
<sld:VendorOption name="sortByGroup">roads</sld:VendorOption>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FFFFFF</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<sld:VendorOption name="sortBy">z</sld:VendorOption>
<sld:VendorOption name="sortByGroup">roads</sld:VendorOption>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
结果如下:

使用分组时,代码将首先绘制 Line.1,Line3
用粗线,然后跟踪并用细线绘制,然后移动到绘制 Line.2
用粗线,最后 Line.2
用细线,达到预期的效果。
跨层Z排序¶
不同的层,例如道路和铁路,可以通过将所有 FeatureTypeStyle
在他们的风格相同 sortByGroup
,前提是满足以下条件:
图层在WMS请求/图层组中并排排列。换句话说,只有当层直接位于请求的后面时,z顺序才允许中断WMS指定的顺序。这可以扩展到任意数量的层,前提是
FeatureTypeStyle
在同一组中没有损坏层样式中没有破坏序列的FeatureTypeStyle
让我们考虑一个例子,一个Rails层有两个 FeatureTypeStyle
一组,另一组不:
特征类型ID |
按组ID排序 |
---|---|
轨道1 |
线条 |
轨道2 |
|
然后我们有一个有两个 FeatureTypeStyle
,都在同一组中:
特征类型ID |
按组ID排序 |
---|---|
道路1 |
线条 |
道路2 |
线条 |
如果WMS请求 &layers=roads,rails
,然后扩展 FeatureTypeStyle
列表将是:
特征类型ID |
按组ID排序 |
---|---|
道路1 |
线条 |
道路2 |
线条 |
轨道1 |
线条 |
轨道2 |
|
因此, road1,road2,rails1
将形成一个单独的组,这将导致轨道在Z排序时与道路合并。
如果相反,WMS请求请求 &layers=rails,roads 然后扩展 ``FeatureTypeStyle` 列表将是:
特征类型ID |
按组ID排序 |
---|---|
轨道1 |
线条 |
轨道2 |
|
道路1 |
线条 |
道路2 |
线条 |
这个 rails2
特征类型样式破坏了序列,因此,轨道将不会与道路在同一组中进行Z排序。