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_优先级缓存列表来处理优先级。将标签添加到标签缓存时,其优先级索引用于决定应在哪个缓存列表中添加标签。

然后在渲染时,我们循环访问缓存列表,从最高优先级列表开始。

在映射文件中指定超出范围的优先级值将导致分析错误。通过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)

向后兼容性问题

没有。

臭虫识别码

投票历史

投票于2007年5月25日完成:

+1人来自丹妮尔姆、史蒂文、史蒂文、亚瑟法、翁伯顿和法兰克。

审查期间的问题/意见

  • 问:为什么要使用一组缓存列表而不是对所有缓存项进行快速排序?

    答:主要是因为性能原因,但也指出Quicksort不稳定,根据标签集,可能会导致不同的订单。