通过使用 SLD , 可以动态修改地图的样式。
本页面描述了在使用 Mapserver 的 WMS Getmap
请求中利用样式化层描述符(SLD)支持的过程。SLD支持服务器端(能够读取 SLD 并将其与 getmap
请求一起应用)和客户端(
包括将SLD请求发送到服务器并从地图服务器的 Mapfile 动态生成SLD文件)。在4.2版中向MapServer添加了SLD支持。
SDL 使用 XML 格式进行定义,先看一下实例:
01 <?xml version="1.0" encoding="UTF-8"?>
02 <StyledLayerDescriptor version="1.0.0"
03 xmlns="http://www.opengis.net/sld"
04 xmlns:ogc="http://www.opengis.net/ogc"
05 xmlns:xlink="http://www.w3.org/1999/xlink"
06 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
07 xsi:schemaLocation="http://www.opengis.net/sld
08 http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
09 <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>
效果:
![使用SLD的GetMap操作](http://webgis.cn/cgi-bin/mapserv?map=/owg/mfb2.map&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMAP&LAYERS=states&BBOX=73,3,136,54&CRS=CRS:84&INFO_FORMAT=text/html&format=image/png&width=200&height=150&styles=&SLD=http://webgis.cn/sld_world_lyr.xml)
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
SLD 1.1.0 版本的定义与最新版本不太一样。
01 <?xml version="1.0" encoding="UTF-8"?>
02 <StyledLayerDescriptor version="1.1.0"
03 xmlns="http://www.opengis.net/sld"
04 xmlns:se="http://www.opengis.net/se"
05 xmlns:ogc="http://www.opengis.net/ogc"
06 xmlns:xlink="http://www.w3.org/1999/xlink"
07 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
08 xsi:schemaLocation="http://www.opengis.net/sld
09 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>
效果:
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