MS RFC 101:添加对与内容相关的图例响应的支持¶
- 日期
2013-07-19
- 作者
托马斯堡
- 联系方式
- 状态
采用
- 版本
MAPServer 6.4
1。总结¶
WMS GetLegendgraphic当前返回的图例图像的内容与WMS规范指定的 Mapfile 中定义的类(也可能被SLD覆盖)匹配。此RFC通过返回与请求范围内实际存在/呈现的功能相对应的图例,建议对GetLegendgraphic响应进行扩展。
此RFC的用例是能够在mapview旁边显示一个图例,其中的图例内容只与mapview中实际存在的功能匹配。
1.1例¶
假设我们有一个道路网的传奇,包括高速公路、主要道路和次要道路的三个等级。
当完全缩小时,getlegendgraphic调用将返回包含三个道路图例图标的图像,每个类一个。
当放大到一个偏远的农村地区(即只有很小的道路)时,getlegendgraphic调用将为次要道路返回带有单个道路图标的图像。
当放大到海洋中时,getlegendgraphic将返回一个没有道路特征图标的图像。
2.第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结构稳定后的较长时间内完成。