MS RFC 39:支持WMS/SLD命名样式¶
- 日期
- 2008年6月25日 
- 作者
- 叶旺沃森阿塞法 
- 联系
- 位于dmsolutions.ca的Assefa 
- 状态
- 采用 
- 版本
- 地图服务器5.2 
概述¶
几年前,当在MapServer中添加了WMS和SLD支持时,其中一个未集成的功能是能够通过WMS GetMap请求使用Styles参数或通过SLD文档中的<NamedStyle>参数指定命名样式。
使用命名样式,WMS客户机可以使用WMS服务器预定义的样式呈现指定的层。
例如:
http://..../mapserv.cgi?Request=GetMap&....&LAYERS=Rivers,Roads,Houses&STYLES=CenterLine,CenterLine,Outline
<StyledLayerDescriptorversion="1.0.0">
  <NamedLayer><Name>Roads</Name>
    <NamedStyle>
      <Name>Casing</Name>
    </NamedStyle>
    <NamedStyle>
      <Name>CenterLine</Name>
    </NamedStyle>
  </NamedLayer>
</StyledLayerDescriptor>
目前还不支持此功能的主要原因是,目前无法在MapServer中定义层上的几个互斥“样式”。此RFC的目的是引入一种简单的机制,允许MapServer定义互斥“样式”。然后,这将允许MapServer通过WMS接口通告和支持命名样式。
提议的变更¶
MAPServer架构(层。类,样式)不适合SLD模型,它假定您可以在一个层上定义互斥的样式,并能够在它们之间切换。
一个合理无中断的可能解决方案是在类对象级别引入组名的概念,并在层级别具有可用于指定要使用的类的参数。这样的建议是:
LAYER
 ...
 CLASSGROUP "group1"
 ...
 CLASS
   NAME "name1"
   GROUP "group1"
   ...
 END
 CLASS
   NAME "name2"
   GROUP "group2"
   ...
 END
 CLASS
   NAME "name3"
   GROUP "group1"
   ...
 END
 ...
- 这将引入两个新的关键字:层级别的ClassGroup和类对象中的Group名称。 
- 这些参数是可选的 
- 如果设置了ClassGroup参数,则渲染时只考虑具有相同组名的类。如果不设置,则将使用所有类(当前行为)。 
- 注意,如果同一层中有定义了不同组的类,那么classgroup将充当默认样式。其思想是,通过WMS请求(或CGI URL变量)的Styles参数将重写ClassGroup的值。在上面的示例中,只有类“name1”和“name3”才会被考虑用于渲染(如果styles=或styles=默认),除非客户端使用styles=group2覆盖此值。 
MapServer中受影响/添加的功能¶
- MapServer矢量渲染(函数msshapegetClass)将使用类组的设置(如果可用) 
- 栅格渲染(函数msgetclass):将使用类组的设置(如果可用) 
- 可以使用url变量修改ClassGroup的值(类似这样的值是有效的:…&map.layer[layername]=ClassGroup+Group2)。这将允许通过CGI在需要时切换层的表示。 
- WMS相关功能: 
- 通过getCapabilities通告样式:样式将基于层中定义的类的不同组名。如果所有类都没有组集,则将保留当前行为(返回带有“默认”名称的样式元素)。如果一个或多个类具有组集,建议为每个“组”输出类似这样的内容: 
<Style>
      <Name>group1</Name>
      <Title>group1</Title>
      <LegendURL width="20" height="10">
         <Format>image/png</Format>
         <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://127.0.0.1/cgi-bin/mapserv.exe?map=f:/msapps/test.map&version=1.1.1&service=WMS&request=GetLegendGraphic&layer=mylayer&format=image/png&STYLES=group1"/>
      </LegendURL>
    </Style>
- 支持SLD中的命名样式。这将具有设置层级类组的效果。如果传递的样式无效,则引发异常。 
- 在WMS GetMap请求的Styles参数中支持样式名。我们仍然支持空样式名以及用于样式的“default”关键字。如果传递的样式无效,则引发异常。 
- GetLegendgraphic将被扩展以支持Styles参数中的名称。如果Style参数存在且值不为空,则会引发一个异常,即Style传递无效。 
- getStyles:当前的行为是将所有类作为userStyle元素返回。当有多种样式可用时,SLD 1.0规范似乎不清楚如何处理:第13.1节指定“…实际上可以由SLD描述的所有请求的样式将作为用户样式元素返回,不能作为名称样式元素返回。……。建议的方法是,如果未设置ClassGroup,则保留当前beahviour;如果设置了,则仅返回指定类上的用户样式元素。 
- 图例绘图需要使用类组的设置(如果可用) 
其他注意事项¶
- 这是否适用于所有类型的图层,如图表图层? 
受影响的文件¶
maplexer.l
mapserver.h
mapfile.h
mapfile.c
mapogcsld.c
mapwms.c
maplegend.c
mapcopy.c
php_mapscript.c
MapScript¶
需要更新set函数(至少在php mapscript中)以在层和类级别设置两个新参数。需要检查是否需要对swig mapscript执行任何操作。
向后兼容性¶
此RFC中描述的所有工作都将向MapServer提供可选功能,并且不期望出现向后兼容性问题。
文档¶
测试¶
在msauto中添加一个测试,通过getmap请求验证对名称样式参数的支持
臭虫识别码¶
投票历史¶
+1:阿塞法,汤克,弗兰克+0,丹尼尔,史蒂文
邮件列表讨论¶
https://lists.osgeo.org/pipermail/mapserver-dev/2007-December/004727.html

