MS RFC 60:标签增强:能够跳过字符重叠过多的角度跟踪标签

日期

2009/06/26

作者

丹尼尔·莫里塞特(dmorissette at mapgears.com)

作者

Alan Boudreault(aboudreault,位于mapgears.com)

最后编辑

2010-09-02

状态

2010-09-23通过

版本

MAPServer 6

概述

目前,在非常尖锐的曲线上,角度跟随标签可能会导致标签上某些字符重叠,从而导致外观不好或有时完全无法读取标签。

这个RFC提出了一种机制来检测角度跟随标签中的重叠字符,并简单地跳过标签,为其他/更好的标签在同一点周围留下空间,从而获得更好的地图。

入场券 #2221 讨论了几种改进有问题的角度跟随标签的选项,包括行平滑,或在检测到重叠时增加字符之间的间距,这些方法可能有潜力,但将单独处理(即在它们自己的RFC中)。

该RFC专门处理跳过具有太多字符重叠和标签的错误标签 #3523 已经为它创造了。

背景

这个问题是作为FOSS4G 2010基准测试的一部分发现的,其中一个要渲染的层是带有标签的轮廓。我们已经看到,MapServer在使用角度跟随的锐利曲线标记某些轮廓方面做得很差,导致字符重叠和标签不可读。

Otoh,我们发现,例如geoserver没有这种有问题的标签,因为它只检测到重叠的字符并跳过这些标签。这是我们建议在这里实施的方法。

以下是同一区域的两张地图,第一张是由带有错误标签的MapServer生成的,第二张是由不带错误标签的GeoServer生成的:

http://trac.osgeo.org/mapserver/attachment/ticket/3523/mapserver-wms.png

http://trac.osgeo.org/mapserver/attachment/ticket/3523/geoserver-wms.png

实验

我们发现,测试字符bbox是否有重叠是没有用的,因为它们中的大多数在正常情况下重叠,正如我们在以下图片中看到的那样:

http://trac.osgeo.org/mapserver/attachment/ticket/3523/mapserver-label-boxes.png

我们发现,我们可以比较给定标签中连续字符的角度,并将其用作可能重叠的更好指标。在大多数情况下,超过22.5度的重叠是决定跳过给定标签的良好阈值。

下图显示了相同的轮廓,其中跳过字符重叠大于22.5度的标签:

http://trac.osgeo.org/mapserver/attachment/ticket/3523/mapserver-label-with-fix.png

下面是另一个街道地图示例:

http://trac.osgeo.org/mapserver/attachment/ticket/3523/maxoverlapangle-2.png

技术解决方案

将向标签对象添加一个新的maxoverlappangle关键字,其值是用于筛选字符重叠的角度跟随标签的角度阈值(以度数表示的浮点值)。

默认情况下,将从MapServer 6.0开始启用此筛选。默认的maxoverlappangle值将为22.5度,这也与geoserver中的默认值匹配。用户可以根据他们所处理的数据类型和对标签中错误重叠的容忍度自由地上下调整值。

设置maxoverlappangle==0将完全禁用基于此条件的标签筛选,恢复6.0之前的行为。

使用实例

此功能默认启用,默认值为22.5度,因此不需要更改映射文件即可启用。

此示例将最大重叠角度增加到30度,从而减少跳过标签的次数:

MAP
  ...
  LABEL
     ANGLE FOLLOW
     ...
     MAXOVERLAPANGLE 30
  END
  ...
END

请记住,此选项可以与repeatdisstance和mindistance结合使用,以生成具有更多标签的地图。下面是一个例子:

MAP
  ...
  LABEL
     ANGLE FOLLOW
     ...
     MAXOVERLAPANGLE 22.5
     REPEATDISTANCE 400
     MINDISTANCE 100
  END
  ...
END

…下面是使用上述设置生成的等高线图:

http://trac.osgeo.org/mapserver/attachment/ticket/3523/mapserver-collisions-repeatdistance-400-min-100.png

向后兼容性问题

默认情况下,此新功能将启用,默认最大重叠角度值为22.5度。现有的映射文件将在不做任何更改的情况下工作,但如果包含多个带有重叠字符的错误标签,则可能最终生成标签较少的映射。始终可以使用maxoverlappangle 0返回到旧的行为(禁用过滤),或者对值进行上下调整以获得更好的结果。

没有其他向后兼容性问题。

文件冲击

  • mapfile.c

  • mapfile.h

  • mapserver.h

  • maplexer.c

  • maplexer.l

  • mapprimitive.c

票据ID

主要客票:

参见:

投票历史

2010年9月23日,丹尼尔、史蒂文、弗兰克、汤克、佩里克尔斯恩、托马斯布、史蒂文、豪沃德、阿塞法伊、杰夫姆和塔马斯通过+1。