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中受影响/添加的功能

  1. MapServer矢量渲染(函数msshapegetClass)将使用类组的设置(如果可用)

  2. 栅格渲染(函数msgetclass):将使用类组的设置(如果可用)

  3. 可以使用url变量修改ClassGroup的值(类似这样的值是有效的:…&map.layer[layername]=ClassGroup+Group2)。这将允许通过CGI在需要时切换层的表示。

  4. 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&amp;version=1.1.1&amp;service=WMS&amp;request=GetLegendGraphic&amp;layer=mylayer&amp;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;如果设置了,则仅返回指定类上的用户样式元素。

  1. 图例绘图需要使用类组的设置(如果可用)

其他注意事项

  • 这是否适用于所有类型的图层,如图表图层?

受影响的文件

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提供可选功能,并且不期望出现向后兼容性问题。

文档

SLDWMS服务器Mapfile 文档将升级。

测试

在msauto中添加一个测试,通过getmap请求验证对名称样式参数的支持

臭虫识别码

https://github.com/MapServer/MapServer/issues/2431

投票历史

+1:阿塞法,汤克,弗兰克+0,丹尼尔,史蒂文

邮件列表讨论

https://lists.osgeo.org/pipermail/mapserver-dev/2007-December/004727.html