MS RFC 101:添加对与内容相关的图例响应的支持

日期

2013-07-19

作者

托马斯堡

联系

thomas.bonfort@gmail.com

状态

采用

版本

MAPServer 6.4

1。总结

WMS GetLegendgraphic当前返回的图例图像的内容与WMS规范指定的映射文件中定义的类(也可能被SLD覆盖)匹配。此RFC通过返回与请求范围内实际存在/呈现的功能相对应的图例,建议对GetLegendgraphic响应进行扩展。

此RFC的用例是能够在mapview旁边显示一个图例,其中的图例内容只与mapview中实际存在的功能匹配。

1.1例

假设我们有一个道路网的传奇,包括高速公路、主要道路和次要道路的三个等级。

  • 当完全缩小时,getlegendgraphic调用将返回包含三个道路图例图标的图像,每个类一个。

  • 当放大到一个偏远的农村地区(即只有很小的道路)时,getlegendgraphic调用将为次要道路返回带有单个道路图标的图像。

  • 当放大到海洋中时,getlegendgraphic将返回一个没有道路特征图标的图像。

2.实施细节

2.1激活功能

当客户端在请求URL中包含(非标准)bbox、srs/crs和width/height参数(如getmap请求)时,对点、线和多边形层上的WMS GetLegendGraphic调用将支持与内容相关的图例。如果不存在这些参数,则将发生经典的图例渲染。

http://server/wms?SERVICE=WMS&VERSION=1.1.0
&REQUEST=GetLegendGraphic&SRS=EPSG:3978
&WIDTH=560&HEIGHT=350&LAYER=layer1&FORMAT=image/png
&BBOX=2258982,-70747,2615354,495480

2.2规范影响

  • 在mswmsdispatch()中,如果在GetLegendgraphic请求期间检测到bbox参数,则处理将跳过当前的GetLegendgraphic代码路径,而不是通过GetMap请求的初始化阶段(设置层组、应用SLD等…)

  • 一旦getmap初始化阶段发生而没有错误,请通过mshitestmap()而不是msdrawmap()。这个新的函数模仿msdrawmap,在这个意义上,它在活动层之间循环,并调用mslayerwhichhapes/mslayernextshape,但是它没有渲染这些功能,而是将它们的层/类/样式/标签标记为已激活或未被地图绘制所激活。

  • msdrawlegenid/msdrawlegenicon传递了一个与命中测试结果相对应的新参数,并将绘制地图的图例图标,具体取决于它们是否在命中测试中激活。

  • 模式=maplegendicon和模式=maplegendicon添加到传统的mapserver cgi中。mapserverobj结构获取一个添加的map-hittest成员,该成员由图例模板化代码用于生成与内容相关的HTML图例。

2.3异常和向后不兼容问题

  • 发送bbox、srs和width/height参数以获得非内容相关的图例的客户端将返回错误的结果。可以说,这些客户机不应该首先发送超出规范的参数。

  • MapServer当前将宽度和高度视为用于图例图标的大小。对于内容相关的图例,这两个参数与bbox一起用于计算当前映射视图的渲染比例,而不是返回的图例图标的大小。虽然可能选择了其他参数名称来避免这种重叠,但实现的宽度和高度与一方面允许重用当前getmap代码路径的实现相同,另一方面,这些参数已经被(仅限于?)使用。支持此扩展的其他WMS实现,即cubewerx。

  • 对内容相关的图例请求忽略规则

  • GetLegendgraphic使用一个layer=参数来指定要使用的层(MapServer具有支持多个层的扩展名,方法是使用layer=layer1,layer2),而GetMap请求使用复数层=。对于内容相关的GetLegendgraphic调用,代码将把layer参数复制到layers参数中,以便使用GetMap代码路径。如果客户机在URL中包含与层参数不一致的层参数,则GetLegendgraphic响应将未定义。

2.4性能影响,MapScript

  • 无性能影响(除了依赖于内容的图例渲染明显慢于传统的图例渲染之外)

  • 没有用户可见的mapscript影响(调用msdrawlegend()和msdrawlegenicon()函数时,mapscript代码本身需要进行一些调整。

  • HitTest的结果对MapScripts不可用。在这个方向上的工作可以在API和HitTest结构稳定后的较长时间内完成。

三。其他

3.1问题跟踪ID

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

3.2投票历史

+1人来自托马斯布、米克斯、汤克、斯蒂芬、佩里恩、史蒂文、史蒂文和杰夫姆。