使用 SLD

发送反馈


SLD(Styled-Layer Descriptor,图层样式表)中定义了可以符号化 WMS 服务的各种样式方案,包括 WMS 服务预定义的样式方案和客户端自定义的样式方案。预定义的样式(STYLES)即内置在 WMS 服务中的 SLD,表现为 Capabilities XML 文档中的 <Style> 节点。除了 WMS 服务预定义的样式,客户端可以对 WMS 服务应用自定义的 SLD,从而对图层进行渲染。用户可通过 GetMap 操作添加相应参数来使用 SLD,SuperMap iServer 目前在 WMS 1.1.1 中支持 SLD 功能,可以为点、线、面及文本图层配置 SLD 信息。两种样式使用方法介绍如下:

SLD 文件是 XML 格式的,它遵循 OGC SLD 标准,从而能够被服务器与客户端所理解。一个 SLD 文件中可以定义多个 SLD 样式。SLD 样式定义了所指定的 WMS 图层的符号化规则(Rule)。一个样式可以有多个规则,每个规则可以包含一个过滤器(Filter)来描述要渲染哪些要素,并包含多个符号化器(Symbolizer)以描述如何渲染这些要素。

使用预定义的 STYLES

预定义的 STYLES 内置在 WMS 服务中,表现为 Capabilities XML 文档中的<Style> 节点。有关发布 SLD 为 SuperMap iServer 服务预定义的 STYLES,请参阅添加 WMS 服务接口。预定义的 STYLES 通过 STYLES=style_list 参数对请求,请求方式如下:

<ServiceRoot>?VERSION=version&REQUEST=GetMap&LAYERS=&STYLES=&SRS=&BBOX=&WIDTH=&HEIGHT=&FORMAT=

ServiceRoot 为服务的 URI 根目录,请参见服务的 URI 设置

SuperMap iServer 默认包含了一个用于渲染面图层的 SLD 文件:%SuperMap iServer_HOME%\webapps\iserver\WEB-INF\config\region.sld,定义了名称为 World 的 Style,启动 iServer 服务即将其发布为预定义的 STYLE。本机 SuperMap iServer WMS 1.1.1服务启动成功之后,使用该样式的 GetMap 请求的 URI 为:http://localhost:8090/iserver/services/maps/wms111/世界地图_Day?VERSION=1.1.1&REQUEST=GetMap&layers=0.11&STYLES=World&SRS=EPSG:4326&BBOX=-180.0,-90.0,180.0,90.0&WIDTH=800&HEIGHT=400&FORMAT=image/png,该请求的响应结果如下:

使用自定义的 STYLES

客户端可以对 WMS 服务应用自定义的 SLD,从而对图层进行渲染。使用自定义的 SLD 来渲染图层,有如下两种方式:

通过引入 SLD 文档的 URI 来渲染所请求的地图, 即在 GetMap 请求中添加 SLD=sld_xml_uri 参数对。其中 sld_xml_uri 必须能够被 WMS 服务器所访问。请求方式如下:

<ServiceRoot>?VERSION=version&REQUEST=GetMap&LAYERS=&STYLES=&SRS=&BBOX=&WIDTH=&HEIGHT=&FORMAT=&SLD=

ServiceRoot 为服务的 URI 根目录,请参见服务的 URI 设置

通过引入 SLD 文档的实际内容来渲染所请求的地图,即在 GetMap 请求中添加 SLD_BODY=sld_xml_body 参数对,其中 sld_body_xml 必须是经过 URI 编码的。请求方式如下:

<ServiceRoot>?VERSION=version&REQUEST=GetMap&LAYERS=&STYLES=&SRS=&BBOX=&WIDTH=&HEIGHT=&FORMAT=&SLD_BODY=

ServiceRoot 为服务的 URI 根目录,请参见服务的 URI 设置

如下是一个 SLD 文档的内容:

 <?xml version="1.0" encoding="UTF-8"?>

<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld"

        xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"

        xmlns:gml="http://www.opengis.net/gml" version="1.0.0">

        <sld:UserLayer>

                <sld:UserStyle>

                        <sld:Name>lineStyle</sld:Name>

                        <sld:FeatureTypeStyle>

                                <sld:FeatureTypeName>Feature</sld:FeatureTypeName>

                                <sld:Rule>

                                        <sld:LineSymbolizer>

                                                <sld:Stroke>

                                                        <sld:CssParameter name="stroke">#0000FF

                                                        </sld:CssParameter>

                                                        <sld:CssParameter name="stroke-width">0.1</sld:CssParameter>

                                                </sld:Stroke>

                                        </sld:LineSymbolizer>

                                </sld:Rule>

                        </sld:FeatureTypeStyle>

                </sld:UserStyle>

        </sld:UserLayer>

</sld:StyledLayerDescriptor>

使用上述 SLD_BODY 的 GetMap 请求示例为:

该请求的响应结果如下,可以看到线图层 OceanBoundary@World 被渲染为了蓝色:

STYLES 与 SLD/SLD_BODY 的匹配规则

在 GetMap 请求中,用户可以指定 STYLES 参数,也可以指定 SLD(SLD_BODY) 参数,二参数的匹配规则如下表。

表1 GetMap 请求中 STYLES 与 SLD/SLD_BODY 的匹配关系

请求中是否包含 STYLES=style_list 参数对 请求中是否包含 SLD=sld_xml_uri(SLD_BODY=sld_xml_body)参数对 STYLES 中 style name 与 SLD(SLD_BODY)中的 style name 是否匹配 采用何种样式渲染 WMS 地图

  使用 STYLES 中的 style 渲染 LAYERS=layer_list 中相应的 layer。

使用 SLD(SLD_BODY)中的 style 渲染  LAYERS=layer_list 中相应的 layer。

使用 STYLES=style_list 中的 style 渲染 LAYERS=layer_list 中相应的 layer。

  SLD(SLD_BODY)中必须包含 named layer ,使用 SLD(SLD_BODY)中的 style 渲染 SLD(SLD_BODY)中的 named layer 标识的图层。