SLD

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

作者

叶旺沃森阿塞法

联系

位于dmsolutions.ca的Assefa

最后更新

2019-11-21

介绍

本文档描述了在使用mapserver的WMS getmap请求中利用样式化层描述符(SLD)支持的过程。SLD支持服务器端(能够读取SLD并将其与getmap请求一起应用)和客户端(包括将SLD请求发送到服务器并从map server映射文件动态生成SLD文件)。在4.2版中向MapServer添加了SLD支持。

本文档假定您已经熟悉mapserver的以下方面:

  • MapServer应用程序开发和设置*.map*文件。

  • 熟悉WMS规范将是一种优势。到MapServer WMS文档的链接包含在下一节中。

服务器端支持

一般信息

WMS请求可以通过两种方式将带有getmap请求的SLD文档传递给mapserver:

  • sld参数指向远程sld(sld=http://url_to_sld)。

  • sld_body参数,用于在URL中发送sld定义。

这两种方法都可以通过MapServer获得。请求的一个例子是:

https://demo.mapserver.org/cgi-bin/wms?SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap
&LAYERS=country_bound
s&SLD=https://demo.mapserver.org/ogc-demos/map/sld/sld_line_simple.xml

测试 remote SLD request .

上述请求中的SLD如下:

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
  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"
  xsi:schemaLocation="http://www.opengis.net/sld
  http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
  <NamedLayer>
    <Name>country_bounds</Name>
    <UserStyle>
      <Title>xxx</Title>
      <FeatureTypeStyle>
        <Rule>
          <LineSymbolizer>
            <Geometry>
              <ogc:PropertyName>center-line</ogc:PropertyName>
            </Geometry>
            <Stroke>
              <CssParameter name="stroke">#0000ff</CssParameter>
            </Stroke>
          </LineSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

同一SLD的1.1.0版

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.1.0"
  xmlns="http://www.opengis.net/sld"
  xmlns:se="http://www.opengis.net/se"
  xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/sld
  http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd">
<NamedLayer>
  <se:Name>country_bounds</se:Name>
    <UserStyle>
      <se:Name>xxx</se:Name>
      <se:FeatureTypeStyle>
        <se:Rule>
          <se:LineSymbolizer>
            <se:Geometry>
              <ogc:PropertyName>center-line</ogc:PropertyName>
            </se:Geometry>
            <se:Stroke>
              <se:SvgParameter name="stroke">#0000ff</se:SvgParameter>
            </se:Stroke>
          </se:LineSymbolizer>
        </se:Rule>
      </se:FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

当mapserver通过一个请求获得一个有效的sld时,它解析这个sld来提取附加到namedlayers的所有样式,然后将这些样式应用到映射,然后将其返回到客户机。应用SLD时,MapServer将SLD文档中NamedLayers的<name>参数与WMS层名称(WMS层名称在 GetCapabilities 请求)。

备注

本文档中给出的所有示例都是有效SLD的实时使用,以及支持SLD的MapServer安装。

还开发了与SLD相关的其他WMS功能:

表1.其他WMS功能

特征

支持

笔记

方法get:sld url

是的

方法get:sld_body

是的

附加项目

描述层

是的

GetLegendGraphic

是的

GetStyles

是的

使用mapscript获取sld

备注

从MapServer 4.2.3版开始,GetLegendgraphic请求(参见 Styled Layer Descriptor Implementation Specification )工作如下:如果请求中没有rule关键字,则将返回包含指定层的整个图例的图像。这个图像由层名和每个类的符号化图形和标签组成。

支持特定SLD元素

下表提供了有关MapServer中SLD支持的更多详细信息。

表2。命名层和用户层

特征

支持

笔记

命名层

是的

用户层

表3。命名层

特征

支持

笔记

LayerFeatureConstraints

是的

从MapServer 7.0.1开始

命名样式

是的

用户风格

是的

表4。用户样式

特征

支持

笔记

名字

这在实现时被删除,因为它不适合MapServer

书名

在MapServer环境中没有使用

摘要

在MapServer环境中没有使用

IsDefault

每层只有一种样式可用

FeatureTypeStyle

是的

MapServer的概念是每层一个要素类型样式(点、线、多边形或栅格)

表5。特征类型

特征

支持

笔记

名字

在MapServer环境中没有使用

书名

在MapServer环境中没有使用

摘要

在MapServer环境中没有使用

FeatureTypeName

在MapServer环境中没有使用

SemanticTypeIdentifier

仍然是SLD规范中的实验元素

规则

是的

表6。规则

特征

支持

笔记

名字

是的

书名

是的

摘要

在MapServer环境中没有使用

LegendGraphic

是的

滤波器

是的

ElseFilter

是的

MinScaleDenominator

是的

MaxScaleDenominator

是的

LineSymbolizer

是的

PolygonSymbolizer

是的

PointSymbolizer

是的

TextSymbolizer

是的

RasterSymbolizer

是的

适用于8位栅格

  • 过滤器和ELSEFILTER

    对于包含筛选器的每个规则,都有一个使用类表达式集创建的类来反映该筛选器。可用的筛选器包括比较筛选器和逻辑筛选器(请参见 Filter Encoding HowTo )elsefilter参数在mapserver中转换为类,并放置在类列表的末尾,不设置表达式。它们用于呈现不适合任何其他类的元素。

  • minscaledenomibator和maxscaledenominator在mapserver中转换为minscale和maxscale。

以下是使用筛选器的有效请求示例:

此示例启用空间过滤,将bbox参数用作选定区域(非洲)的过滤器。请注意,ELSEFILTER不适用于空间过滤器。

表7。线条符号

特征

支持

笔记

几何图形

MapServer使用数据几何图形进行渲染

笔划:图形填充

使用纯色

行程:图形行程

是的

沿直线绘制符号

行程(cssparameter):行程

是的

支持RGB颜色

行程(cssparameter):宽度

是的

笔划(cssparameter):不透明度

是的

仅适用于agg驱动程序和mapserver版本>=5.2

行程(cssparameter):线路连接和线路盖

MapServer不支持

行程(cssparameter):dasharray

是的

行程(cssparameter):dashoffset

垂直偏移(仅在SLD 1.1.0中)

是的

将设置样式对象的偏移值

初始间隙(图行程SLD 1.1.0)

间隙(图行程参数SLD 1.1.0)

备注

SLD 1.1.0需要SVG参数而不是CSS参数。

以下是使用LineSymbolar的有效请求示例:

表8。多边形符号

特征

支持

笔记

几何图形

脑卒中

是的

笔画与线条符号相同

填充

是的

除了实体填充外,还支持符号填充多边形。

填充不透明度

是的

仅适用于agg驱动程序和mapserver版本>=5.2

PerperdicularOffset

SLD 1.1.0参数

取代

是的

SLD 1.1.0参数。在mapserver中设置offsetx/y

填充可以是实心填充,也可以是图形填充,图形填充是一个众所周知的标记符号(例如,正方形、圆形、三角形、星形、十字、x)或通过URL提供的外部图形元素(例如,gif、png)。当在SLD中使用标记符号时,MapServer会在映射文件中创建相应的符号,并使用它来呈现符号。使用外部图形时,文件将保存在本地,并在引用此文件的映射文件中创建PixMap符号。

备注

Web对象ImagePath用于保存文件。

以下是使用多边形符号的有效请求示例:

表9。点符号

特征

支持

笔记

几何图形

图形:标记符号

是的

支持知名名称(正方形、圆形、三角形、星形、十字形、x)

图形:外部图形

是的

除了实体填充外,还支持符号填充多边形。

不透明性

是的

在MapServer 5.4中添加了支持

尺寸

是的

旋转

是的

在MapServer 5.4中添加了支持

取代

是的

SLD 1.1.0参数。在MapServer 5.4中添加了支持

AnchorPoint

备注

有关如何在MapServer中应用标记和外部图形符号,请参阅多边形符号说明。

以下是使用PointSymbolar的有效请求示例:

表10。文本符号

特征

支持

笔记

几何图形

标签

是的

>=8.0版本的地图服务器行为更改,请参阅下面的注释

字体(字体系列)

是的

使用的字体名称是MapServer字体文件中可用的字体名称。如果没有可用字体,则使用默认位图字体

字体样式(斜体,…)

是的

字体粗细

是的

字体大小

是的

如果不使用真字体,则给出默认位图大小。

LabelPlacement

是的

支持PointPlacement。版本>=5.2.1支持lineplacement。换行时只支持垂直偏移和未对齐。

晕圈

是的

支持(填充转换为大纲颜色,半径转换为大纲宽度。请注意,大纲宽度仅适用于大于等于5.2的agg)

填充

是的

只有纯色可用

文本符号上的注释:

  • 标签 :从Version>=8.0开始,遵循OGC标准,标签标签中的原始文本被解释为隐式文字,而不是隐式PropertyName。此外,还支持文本和函数标签,以及混合内容。支持的函数是返回数字的MapServer函数。

  • :

  • 除了用于这些层的其他符号外,可以在点、线或多边形层的MapServer中使用文本符号。

  • 点间距:点的放置包括锚定点(在MapServer中转换为位置)、位移(转换为偏移)和角度(转换为角度)。

  • 角度设置(MapServer版本>=5.4):默认情况下,角度参数设置为自动。对于点功能,用户可以使用PointPlacement更改值。对于行功能,用户可以添加一个lineplacement:如果“空”lineplacement是SLD的一部分,则角度将设置为follow;如果lineplacement包含perpendicualaroffset参数,则角度将设置为0,并且perpendicualaroffset将用于设置标签对象中的偏移值。SLD 1.1.0引入了lineplacement的isAligned参数:如果此参数设置为false,则角度将设置为0。

以下是使用文本符号的有效请求示例:

表11。刺刀符号

特征

支持

笔记

几何图形

不透明性

是的

ChannelSelection

OverlapBehaviour

ColorMap

是的

ContrastEnhancement

ShadedRelief

ImageOutline

MapServer中当前的支持仅包括对colormap参数的支持。它可用于8位栅格的分类。在颜色映射参数中,提取颜色和数量参数并用于分类。

表12。彩色地图

SLD 1.0提供以下功能

特征

支持

笔记

颜色

是的

不透明性

数量

是的

标签

以下是SLD 1.0的颜色映射用法示例。

如果我们在SLD中有以下颜色映射:

<ColorMap>
  <ColorMapEntry color="#00ff00" quantity="22"/>
  <ColorMapEntry color="#00bf3f" quantity="30"/>
  <ColorMapEntry color="#007f7f" quantity="37"/>
  <ColorMapEntry color="#003fbf" quantity="45"/>
  <ColorMapEntry color="#0000ff" quantity="52"/>
  <ColorMapEntry color="#000000" quantity="60"/>
</ColorMap>

创建的六个类是:

class 1: [pixel] >= 22 AND [pixel] < 30 with color 00ff00
class 2: [pixel] >= 30 AND [pixel] < 37 with color 00bf3f
class 3: [pixel] >= 37 AND [pixel] < 45 with color 007f7f
class 4: [pixel] >= 45 AND [pixel] < 52 with color 003fbf
class 5: [pixel] >= 52 AND [pixel] < 60 with color 0000ff
class 6: [pixel] = 60 with color 000000

备注

ColorMapEntry数量参数应按递增顺序排列。

SLD 1.1提供以下功能

特征

支持

笔记

分类

是的

以下是带有栅格符号的和SLD 1.1.0的示例

<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld
 http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd"
 xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
 xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<se:Name>landsat</se:Name>
<UserStyle>
<se:Name>xxx</se:Name>
<se:FeatureTypeStyle>
<se:Rule>
<se:RasterSymbolizer>
<se:Opacity>0.7</se:Opacity>
<se:ColorMap>
<se:Categorize fallbackValue="#78c818">
<se:LookupValue>Rasterdata</se:LookupValue>
<se:Value>#ffffff</se:Value>
<se:Threshold>22</se:Threshold>
<se:Value>#00ff00</se:Value>
<se:Threshold>30</se:Threshold>
<se:Value>#00bf3f</se:Value>
<se:Threshold>37</se:Threshold>
<se:Value>#007f7f</se:Value>
<se:Threshold>45</se:Threshold>
<se:Value>#003fbf</se:Value>
<se:Threshold>52</se:Threshold>
<se:Value>#0000ff</se:Value>
<se:Threshold>60</se:Threshold>
<se:Value>#000000</se:Value>
</se:Categorize>
</se:ColorMap>
</se:RasterSymbolizer>
</se:Rule>
</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

创建的类包括:

class 1: [pixel] < 22 with color ffffff
class 2: [pixel] >= 22 AND [pixel] < 30 with color 00ff00
class 3: [pixel] >= 30 AND [pixel] < 37 with color 00bf3f
class 4: [pixel] >= 37 AND [pixel] < 45 with color 007f7f
class 5: [pixel] >= 45 AND [pixel] < 52 with color 003fbf
class 6: [pixel] >= 52 AND [pixel] < 60 with color 0000ff
class 7: [pixel] >= 60 with color 000000

使用8位和16位栅格的示例如下:

表13。layerFeatureConstraints(MapServer 7.0.1或更高版本)

特征

支持

笔记

FeatureTypeConstraint

是的

仅出现一次

表14。FeatureTypeConstraint(MapServer 7.0.1或更高版本)

特征

支持

笔记

FeatureTypeName

滤波器

是的

范围

可以通过layerFeatureConstraints/FeatureTypeConstraint将筛选器应用于命名样式或用户样式。它用于选择要渲染的功能。如果样式还具有过滤规则,则它们与FeatureTypeConstraint的过滤器(以及在映射文件配置中的层上设置的任何过滤器或本机过滤器)组合在一起。

<NamedLayer>
    <Name>Layer1</Name>
    <LayerFeatureConstraints>
        <FeatureTypeConstraint>
            <Filter>....</Filter>
        </FeatureTypeConstraint>
    </LayerFeatureConstraints>
    <NamedStyle>
        <Name>the_style</Name>
    </NamedStyle>
</NamedLayer>

客户端支持

SLD的客户端支持包括两部分:

  • 第一部分是使用mapserver作为WMS客户机发送带有SLD的getmap请求。这是通过使用两个元数据来完成的,这两个元数据可以放置在MapServer映射文件的层级别上。这两个元数据是:

    • wms_sld_url ,它接受有效的URL作为值,并将sld=xxx附加到GetMap请求。

    • wms_sld_body 获取有效的SLD字符串,并将SLD_BODY=xxx附加到GetMap请求。如果WMS_SLD_BODY的值设置为AUTO,MapServer将基于在层中找到的类生成SLD,并将此SLD作为GetMap请求中SLD_BODY参数的值发送。

  • 另一个主要项目是从MapServer类生成SLD文档。这些功能目前通过mapserver/mapscript接口提供。以下是可用的功能:

    • 在地图对象上: generatesld

    • 在层对象上: generatesld

    已添加或将添加其他mapscript函数以补充这些函数:

    • 在地图对象上: applysld

    • 在层对象上: applysld

备注

当从mapserver类生成sld时,如果存在pixmap符号,则需要通过URL提供该符号,以便在sld中将其转换为外部图形符号。为此,您需要通过 Mapfile 中名为wms-sld-symbol-url的Web对象级元数据定义URL。生成的SLD使用此URL并连接pixmap符号文件的名称以获取作为外部管理URL生成的值。

从mapfile生成sld的php/mapscript示例

下面是一个小脚本,它调用generatesld()函数为mapfile中的特定层创建一个sld:

 1<?php
 2
 3// define variables
 4define( "MAPFILE", "D:/ms4w/apps/cadastra/map/cadastra.map" );
 5define( "MODULE", "php_mapscript.dll" );
 6
 7// load the mapscript module
 8if (!extension_loaded("MapScript")) dl(MODULE);
 9
10// open map
11$oMap = ms_newMapObj( MAPFILE );
12
13// get the parcel layer
14$oLayer = $oMap->getLayerByName("parcel");
15
16// force visibilty of the layer
17$oLayer->set('status', MS_ON);
18
19// generate the sld for that layer
20$SLD = $oLayer->generateSLD();
21
22// save sld to a file
23$fp = fopen("parcel-sld.xml", "a");
24fputs( $fp, $SLD );
25fclose($fp);
26
27?>

命名样式支持

MapServer 5.2中引入了命名样式支持。支持基于 MS RFC 39:支持WMS/SLD命名样式 .

MapServer 5.2引入了使用两个新的非强制关键字ClassGroup(在层级别)和Group(在类级别)将组分配给在层对象上定义的一系列类的可能性:

LAYER
    ...
    CLASSGROUP "group1"
    ...
    CLASS
        NAME "name1"
        GROUP "group1"
        ...
    END
    CLASS
        NAME "name2"
        GROUP "group2"
        ...
    END
    CLASS
        NAME "name3"
        GROUP "group1"
        ...
    END
    ...

在呈现时,如果定义了ClassGroup,则只使用具有相同组名的类。基于这个概念,WMS/SLD支持使用类组作为命名样式。每组类被视为等同于命名样式:

  • getCapibilities请求将输出所有可用的样式

  • getmap请求可以使用styles参数指定命名样式

  • GetLegendgraphic可以使用Styles参数指定命名的样式

其他实施项目

  • 支持带标记和外部图形符号的填充多边形。

  • 要分析和应用SLD的mapscript函数。

  • sld-body在客户端和服务器端请求支持。

实施过程中发现的问题

  • 筛选器编码对比较筛选器和逻辑筛选器的限制。空间过滤器不可用,因为它需要在MapServer WMS支持中进行重大更改。