MS RFC 57:标签增强:沿行/多行重复标签的能力

日期

2009/06/26

作者

艾伦布德罗

联系

地图齿轮网的Aboudreault

最后编辑

2009/06/29

状态

通过(2009/07/21)并实施。

版本

MAPServer 6

概述

目前,MapServer在线性形状的最长段上绘制标签。即使形状是长线或多行形状,也只绘制一个标签。在某些情况下,使用更多的标签可以大大提高地图的质量。

这个RFC提出了一种机制,通过添加沿着长线或多行形状添加更多标签的能力来解决这个问题。提出了两个主要的增强。

请参见“图像”部分以可视化当前和新行为。

增强1:标记多行形状中的所有行

目前,如果您有多行形状(即numlines>1的shapeobj),那么只标记最长的行。这在大多数情况下是可以的,但在某些情况下,我们可能希望多行中的每一行都得到一个标签。这是第一个建议的增强:使它可以在多行形状中标记所有行。

增强2:沿一条线重复标签的能力

此时,如果是角度跟随,则标签放置在直线的中心,如果是角度自动常量,则标签放置在直线最长段的中心。对于非常长的线条(道路),尤其是在使用metatiles渲染平铺缓存时,我们可能希望沿线条每隔一段时间重复标签。这是第二个增强功能:使标签可以沿一条直线以给定的间隔重复。

技术解决方案

在mapfile中控制这个的方法是添加label.repeatInstance参数。默认情况下,这将被关闭,我们将保留当前行为。如果repeatInstance设置为任何大于0的值,则标签将在多行形状的每一行上重复(上面的增强1),并将在给定行上以repeatInstance像素的间隔重复多次(上面的项目2)。在所有情况下,MinDistance值仍将由标签缓存处理,以便标签缓存可以消除由于各种原因导致的多个标签之间的距离过近。

为了获得更好的视觉效果,以下是设置repeatDistance时应用的算法概述:

  1. 计算适合行长度的标签候选数(n)。

  2. 确保n是奇数。如果它是偶数,那么减去一得到一个奇数。我们需要一个奇数的标签候选人沿一条给定的线,这样总是有一个候选人落在线的中心,并将保留在碰撞的情况下。对于偶数的候选者,当沿着一条线发生冲突时,剩余的标签通常沿该线移动一个或另一个方向,而不是居中,这看起来不太好。

  3. 计算标签之间的偏移量和沿线的候选位置。

  4. 将标签候选项插入标签缓存,以确保标签缓存在发生冲突时消除正确的标签(请记住,冲突仍然可能发生,因为心态仍然有效)。我们希望对线中心的标签候选人给予更高的优先权,对其他候选人给予更低的优先权,因为他们离中心越远。由于标签缓存顺序是后进先出(LIFO),我们首先将行末端的标签候选插入缓存末端,中间的标签候选插入缓存末端,使其具有最高优先级。

使用实例

此示例将在多行形状的每行上每80个像素重复一次标签。

MAP
  ...
  LABEL
     REPEATDISTANCE 80
  END
  ...
END

向后兼容性问题

没有向后兼容性问题。默认情况下,label.repeatInstance参数设置为0,因此不应用。

文件冲击

  • mapprimitive.c:修改标签放置算法

  • mapfile.c,maplexer.l:new label.repeatInstance mapfile关键字

  • mapdraw.c:修改处理mspolylinelabel*调用的方式

票据ID

图像

因为一张图片胜过千言万语:

投票历史

2009/07/21通过,史蒂文、丹尼尔、史蒂文、阿塞法伊、托马斯布和佩里克列森的+1。