MS RFC 27:标签优先级¶
- 日期
2007/05/22
- 作者
丹尼尔·莫里塞特
- 联系方式
在mapgears.com的dmorissette
- 最后编辑
2007/06/29
- 状态
通过(2007/05/25)-完成实施(2007/07/05)
- 版本
MAPServer 5
概述¶
MapServer4.10及更低版本使用后进先出(LIFO)机制在地图上绘制标签。这导致过度使用注释层以使某些标签更加突出。这个RFC在label对象上引入了一个新的priority参数来控制标签的呈现顺序。
技术解决方案¶
优先级是一个新的标签参数,它采用介于1(最低)和ms_max_label_priority(最高)之间的整数值。默认值为1。
ms_max_label_priority已定义,可在map.h中更改,其默认值为10。
通过在标签缓存中维护一组ms_max_label_优先级缓存列表来处理优先级。将标签添加到标签缓存时,其优先级索引用于决定应在哪个缓存列表中添加标签。
然后在渲染时,我们循环访问缓存列表,从最高优先级列表开始。
在 Mapfile 中指定超出范围的优先级值将导致分析错误。通过mapscript设置的或来自shape属性的超出范围的值将被固定到msaddlabel()中的最小/最大值。
使用标签优先级对性能没有预期的影响。
支持属性绑定¶
优先级参数也可以使用RFC-19中定义的属性绑定机制绑定到属性。这意味着两种设置标签优先级的方法:
...
LABEL
PRIORITY 5
...
END
...
或
...
LABEL
PRIORITY [someattribute]
...
END
...
对源代码的修改¶
优先级将添加到map.h、mapfile parser/writer(mapfile.c)和mapscript中的label对象。
将定义一个ms_is_valid_label_priority()宏,以在任何地方以一致的方式验证优先级范围。
标签缓存代码(maplabel.c)将被修改为使用ms_max_label_优先级缓存列表的数组,而不是单个列表。
将修改各种msdrawlabelcachexx()函数,用两个嵌套循环替换缓存项的当前循环:外部循环将在缓存列表上迭代(从最高到最低),内部循环将在每个列表内迭代缓存项。
将更新msbindLayerToShape()以支持形状属性字段的绑定优先级。
MapScript含义¶
labelobj将具有一个新的integer类型的priority属性。
受影响的文件¶
map.h
mapfile.c
maplabel.c
maputil.c
mapgd.c (msDrawLabelCacheGD)
mapimagemap.c (msDrawLabelCacheIM)
mappdf.c (msDrawLabelCachePDF)
mapsvg.c (msDrawLabelCacheSVG)
mapswf.c (msDrawLabelCacheSWF)
mapagg.cpp (msDrawLabelCacheAGG)
向后兼容性问题¶
没有。
臭虫识别码¶
Bug206还提到了标签优先级,但已作为1619的副本关闭:https://github.com/mapserver/mapserver/issues/206
审查期间的问题/意见¶
问:为什么要使用一组缓存列表而不是对所有缓存项进行快速排序?
答:主要是因为性能原因,但也指出Quicksort不稳定,根据标签集,可能会导致不同的订单。