SLD¶
- 作者
Jeff McKenna
- 联系方式
jmckenna at gatewaygeomatics.com
- 作者
Yewondwossen Assefa
- 联系方式
assefa at dmsolutions.ca
- 最后更新
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。
以下是使用筛选器的有效请求示例:
带一个过滤器的线路: sld 6a / full request 6a
带有多个过滤器的行: sld 6b / full request 6b
带有一个过滤器和另一个过滤器的线路: sld 6c / full request 6c
使用bbox的空间过滤器: sld 6d / full request 6d
此示例启用空间过滤,将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的有效请求示例:
简单线: sld 7a / full request 7a
线条宽度: sld 7b / full request 7b
虚线: sld 7c / full request 7c
表8。多边形符号
特征 |
支持 |
笔记 |
---|---|---|
几何图形 |
不 |
|
脑卒中 |
是的 |
笔画与线条符号相同 |
填充 |
是的 |
除了实体填充外,还支持符号填充多边形。 |
填充不透明度 |
是的 |
仅适用于agg驱动程序和mapserver版本>=5.2 |
PerperdicularOffset |
不 |
SLD 1.1.0参数 |
取代 |
是的 |
SLD 1.1.0参数。在mapserver中设置offsetx/y |
填充可以是实心填充,也可以是图形填充,图形填充是一个众所周知的标记符号(例如,正方形、圆形、三角形、星形、十字、x)或通过URL提供的外部图形元素(例如,gif、png)。当在SLD中使用标记符号时,MapServer会在 Mapfile 中创建相应的符号,并使用它来呈现符号。使用外部图形时,文件将保存在本地,并在引用此文件的 Mapfile 中创建PixMap符号。
注解
Web对象ImagePath用于保存文件。
以下是使用多边形符号的有效请求示例:
简单实心填充: sld 8a / full request 8a
带轮廓的实心填充: sld 8b / full request 8b
用标记符号填充: sld 8c / full request 8c
用外部符号填充: sld 8d / full request 8d
表9。点符号
特征 |
支持 |
笔记 |
---|---|---|
几何图形 |
不 |
|
图形:标记符号 |
是的 |
支持知名名称(正方形、圆形、三角形、星形、十字形、x) |
图形:外部图形 |
是的 |
除了实体填充外,还支持符号填充多边形。 |
不透明性 |
是的 |
在MapServer 5.4中添加了支持 |
尺寸 |
是的 |
|
旋转 |
是的 |
在MapServer 5.4中添加了支持 |
取代 |
是的 |
SLD 1.1.0参数。在MapServer 5.4中添加了支持 |
AnchorPoint |
不 |
注解
有关如何在MapServer中应用标记和外部图形符号,请参阅多边形符号说明。
以下是使用PointSymbolar的有效请求示例:
填充标记符号: sld 9a / full request 9a
默认设置(正方形,6号,颜色128/128/128): sld 9b / full request 9b
外部符号: sld 9c / full request 9c
表10。文本符号
特征 |
支持 |
笔记 |
---|---|---|
几何图形 |
不 |
|
标签 |
是的 |
|
字体(字体系列) |
是的 |
使用的字体名称是MapServer字体文件中可用的字体名称。如果没有可用字体,则使用默认位图字体 |
字体样式(斜体,…) |
是的 |
|
字体粗细 |
是的 |
|
字体大小 |
是的 |
如果不使用真字体,则给出默认位图大小。 |
LabelPlacement |
是的 |
支持PointPlacement。版本>=5.2.1支持lineplacement。换行时只支持垂直偏移和未对齐。 |
晕圈 |
是的 |
支持(填充转换为大纲颜色,半径转换为大纲宽度。请注意,大纲宽度仅适用于大于等于5.2的agg) |
填充 |
是的 |
只有纯色可用 |
文本符号上的注释:
字体名称:将字体参数转换为MapServer时,应用以下规则获取字体名称:fontFamily fontStyle fontweight。例如,如果有一个sld,其字体系列为Arial,字体样式为斜体,字体粗细等于粗体,则生成的mapserver字体名称为Arial粗体斜体。字体样式和粗细不是必需的,如果不可用,它们不会用于生成字体名称。当SLD中的字体样式或字体粗细设置为“正常”时,在构建名称时也会忽略它。例如,如果有一个sld,其字体系列为Arial,字体样式为Normal,字体粗细等于粗体,则生成的mapserver字体名称为Arial粗体。
除了用于这些层的其他符号外,可以在点、线或多边形层的MapServer中使用文本符号。
点间距:点的放置包括锚定点(在MapServer中转换为位置)、位移(转换为偏移)和角度(转换为角度)。
角度设置(MapServer版本>=5.4):默认情况下,角度参数设置为自动。对于点功能,用户可以使用PointPlacement更改值。对于行功能,用户可以添加一个lineplacement:如果“空”lineplacement是SLD的一部分,则角度将设置为follow;如果lineplacement包含perpendicualaroffset参数,则角度将设置为0,并且perpendicualaroffset将用于设置标签对象中的偏移值。SLD 1.1.0引入了lineplacement的isAligned参数:如果此参数设置为false,则角度将设置为0。
以下是使用文本符号的有效请求示例:
点图层:标签、字体、点位置、颜色、角度测试: sld 10a / full request 10a
带文本和符号的点图层,使用2个符号: sld 10b / full request 10b
使用2个符号的文本线条层: sld 10c / full request 10c
表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的过滤器(以及在 Mapfile 配置中的层上设置的任何过滤器或本机过滤器)组合在一起。
<NamedLayer>
<Name>Layer1</Name>
<LayerFeatureConstraints>
<FeatureTypeConstraint>
<Filter>....</Filter>
</FeatureTypeConstraint>
</LayerFeatureConstraints>
<NamedStyle>
<Name>the_style</Name>
</NamedStyle>
</NamedLayer>
客户端支持¶
SLD的客户端支持包括两部分:
第一部分是使用mapserver作为WMS客户机发送带有SLD的getmap请求。这是通过使用两个元数据来完成的,这两个元数据可以放置在MapServer Mapfile 的层级别上。这两个元数据是:
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php
// define variables
define( "MAPFILE", "D:/ms4w/apps/cadastra/map/cadastra.map" );
define( "MODULE", "php_mapscript.dll" );
// load the mapscript module
if (!extension_loaded("MapScript")) dl(MODULE);
// open map
$oMap = ms_newMapObj( MAPFILE );
// get the parcel layer
$oLayer = $oMap->getLayerByName("parcel");
// force visibilty of the layer
$oLayer->set('status', MS_ON);
// generate the sld for that layer
$SLD = $oLayer->generateSLD();
// save sld to a file
$fp = fopen("parcel-sld.xml", "a");
fputs( $fp, $SLD );
fclose($fp);
?>
|
命名样式支持¶
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参数指定命名的样式
实施过程中发现的问题¶
筛选器编码对比较筛选器和逻辑筛选器的限制。空间过滤器不可用,因为它需要在MapServer WMS支持中进行重大更改。