5.7. WMS图层使用SLD

通过使用SLD,可以动态修改地图的样式。

本页介绍使用Mapserver在WMS Getmap 请求中利用样式化层描述符(SLD)支持的过程。SLD支持服务器端(读取SLD并将其应用于 getmap 请求的能力)和客户端(包括向服务器发送SLD请求并从地图服务器的Mapfile动态生成SLD文件)。4.2版本中的MapServer增加了对SLD的支持。

5.7.1. SLD的定义和作用

SDL使用XML格式定义。让我们来看一下这个例子:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<StyledLayerDescriptor version="1.0.0"
 3  xmlns="http://www.opengis.net/sld"
 4  xmlns:ogc="http://www.opengis.net/ogc"
 5  xmlns:xlink="http://www.w3.org/1999/xlink"
 6  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 7  xsi:schemaLocation="http://www.opengis.net/sld
 8  http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
 9  <NamedLayer>
10    <Name>states</Name>
11    <UserStyle>
12      <Title>xxx</Title>
13      <FeatureTypeStyle>
14        <Rule>
15          <LineSymbolizer>
16            <Geometry>
17              <ogc:PropertyName>center-line</ogc:PropertyName>
18            </Geometry>
19            <Stroke>
20              <CssParameter name="stroke">#0000ff</CssParameter>
21            </Stroke>
22          </LineSymbolizer>
23        </Rule>
24      </FeatureTypeStyle>
25    </UserStyle>
26  </NamedLayer>
27</StyledLayerDescriptor>

效果:

GetMap操作与SLD一起使用

GetMap操作与SLD一起使用

使用GetMap获取部分地图

URL的解析方式如下:

>>> [print(idx, x) for idx, x  in enumerate(url.split('&'))]
0 http://webgis.cn/cgi-bin/mapserv?map=/owg/mfb2.map
1 SERVICE=WMS
2 VERSION=1.3.0
3 REQUEST=GetMAP
4 LAYERS=states
5 BBOX=73,3,136,54
6 CRS=CRS:84
7 INFO_FORMAT=text/html
8 format=image/png
9 width=200
10 height=150
11 styles=
12 SLD=http://webgis.cn/sld_world_lyr.xml

5.7.2. SLD 1.1.0版本的定义和作用

SLD 1.1.0版本的定义与最新版本并不完全相同。

 1<?xml version="1.0" encoding="UTF-8"?>
 2<StyledLayerDescriptor version="1.1.0"
 3  xmlns="http://www.opengis.net/sld"
 4  xmlns:se="http://www.opengis.net/se"
 5  xmlns:ogc="http://www.opengis.net/ogc"
 6  xmlns:xlink="http://www.w3.org/1999/xlink"
 7  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 8  xsi:schemaLocation="http://www.opengis.net/sld
 9  http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd">
10  <NamedLayer>
11    <se:Name>states</se:Name>
12    <UserStyle>
13      <se:Name>country</se:Name>
14      <se:FeatureTypeStyle>
15        <se:Rule>
16          <se:Name>country-rule1</se:Name>
17          <se:PolygonSymbolizer>
18            <se:Geometry>
19              <ogc:PropertyName>center-line2</ogc:PropertyName>
20            </se:Geometry>
21            <se:Fill>
22              <se:SvgParameter name="fill">#e8e8e8</se:SvgParameter>
23            </se:Fill>
24            <se:Stroke>
25              <se:SvgParameter name="stroke">#0000ff</se:SvgParameter>
26              <se:SvgParameter name="stroke-width">3</se:SvgParameter>
27            </se:Stroke>
28          </se:PolygonSymbolizer>
29        </se:Rule>
30      </se:FeatureTypeStyle>
31    </UserStyle>
32  </NamedLayer>
33  <NamedLayer>
34    <se:Name>states_line</se:Name>
35    <UserStyle>
36      <se:Name>country</se:Name>
37      <se:FeatureTypeStyle>
38        <se:Rule>
39          <se:Name>country-rule1</se:Name>
40          <se:LineSymbolizer>
41            <se:Geometry>
42              <ogc:PropertyName>center-line</ogc:PropertyName>
43            </se:Geometry>
44            <se:Stroke>
45              <se:SvgParameter name="stroke">#ff0000</se:SvgParameter>
46            </se:Stroke>
47          </se:LineSymbolizer>
48        </se:Rule>
49      </se:FeatureTypeStyle>
50    </UserStyle>
51  </NamedLayer>
52</StyledLayerDescriptor>

效果:

SLD 1.0.0的效果

SLD 1.0.0的效果

使用GetMap获取部分地图

URL的解析方式如下:

>>> [print(idx, x) for idx, x  in enumerate(url.split('&'))]
0 http://webgis.cn/cgi-bin/mapserv?map=/owg/mfb2.map
1 SERVICE=WMS
2 VERSION=1.3.0
3 REQUEST=GetMAP
4 LAYERS=states
5 BBOX=73,3,136,54
6 CRS=CRS:84
7 INFO_FORMAT=text/html
8 format=image/png
9 width=200
10 height=150
11 styles=
12 SLD=http://webgis.cn/sld_world_lyr110.xml