在单个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>

结果如下:

../../../../_images/roads-no-group.png

这是因为当道路按正确的顺序装载时, 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>

结果如下:

../../../../_images/roads-group.png

使用分组时,代码将首先绘制 Line.1,Line3 用粗线,然后跟踪并用细线绘制,然后移动到绘制 Line.2 用粗线,最后 Line.2 用细线,达到预期的效果。

跨层Z排序

不同的层,例如道路和铁路,可以通过将所有 FeatureTypeStyle 在他们的风格相同 sortByGroup ,前提是满足以下条件:

  • 图层在WMS请求/图层组中并排排列。换句话说,只有当层直接位于请求的后面时,z顺序才允许中断WMS指定的顺序。这可以扩展到任意数量的层,前提是 FeatureTypeStyle 在同一组中没有损坏

  • 层样式中没有破坏序列的FeatureTypeStyle

让我们考虑一个例子,一个Rails层有两个 FeatureTypeStyle 一组,另一组不:

特征类型ID

按组ID排序

轨道1

线条

轨道2

none

然后我们有一个有两个 FeatureTypeStyle ,都在同一组中:

特征类型ID

按组ID排序

道路1

线条

道路2

线条

如果WMS请求 &layers=roads,rails ,然后扩展 FeatureTypeStyle 列表将是:

特征类型ID

按组ID排序

道路1

线条

道路2

线条

轨道1

线条

轨道2

none

因此, road1,road2,rails1 将形成一个单独的组,这将导致轨道在Z排序时与道路合并。

如果相反,WMS请求请求 &layers=rails,roads 然后扩展 ``FeatureTypeStyle` 列表将是:

特征类型ID

按组ID排序

轨道1

线条

轨道2

none

道路1

线条

道路2

线条

这个 rails2 特征类型样式破坏了序列,因此,轨道将不会与道路在同一组中进行Z排序。