MS RFC 81:带引线的偏移标签

日期

2011/12/15

作者

托马斯堡

联系

t在terriscope.fr的端口

状态

采用

版本

地图服务器6.2

1。概述

当前标签方案将标签文本放置在它们所附着的点附近。在labelcache阶段,根据标签的位置,测试一个或九个标签位置,如果所有这些位置都与已渲染的标签发生冲突,则放弃标签。

此RFC建议扩展为给定标签测试的位置数量,并从呈现的文本到标签附加到的实际位置呈现一条引线。

建议更改的示例呈现可以是:

../../_images/label-leaders.jpg

2。拟议技术变更

如果标签配置了“leader”参数,则将对labelcache代码进行扩展,以测试扩展的标签位置。将有两个配置选项指定如何确定偏移位置:

  • “引线距离”将确定标签文本与原始锚定位置之间的最大距离。

  • leadergridstep将确定每个测试位置之间的像素步进。

如果由于与现有标签或标记的碰撞而无法放置标签,则通过进一步迭代并远离原始标签点对替代位置进行采样。在下图中,“x”表示原始标签点,“.”表示单个像素,“0”表示在上一次迭代中已测试的偏移,“1”、“2”、“3”表示在当前迭代中测试位置的顺序。

第一次迭代:

2...1...2
.........
.........
.........
1...X...1
.........
.........
.........
2...1...2

第二次迭代:

3...2...1...2...3
.................
.................
.................
2...0...0...0...2
.................
.................
.................
1...0...X...0...1
.................
.................
.................
2...0...0...0...2
.................
.................
.................
3...2...1...2...3

第三次迭代:

3...2...2...1...2...2...3
.........................
.........................
.........................
2...0...0...0...0...0...2
.........................
.........................
.........................
2...0...0...0...0...0...2
.........................
.........................
.........................
1...0...0...X...0...0...1
.........................
.........................
.........................
2...0...0...0...0...0...2
.........................
.........................
.........................
2...0...0...0...0...0...2
.........................
.........................
.........................
3...2...2...1...2...2...3

对于每个偏移位置,文本的实际位置根据偏移的一般方向进行调整(例如,对于原始点垂直的标签,位置“uc”,右上对角线的位置“ur”等)。

一旦偏移位置不会与现有标签发生冲突,迭代就会停止,在这种情况下,标签文本会被发送到渲染后端,或者一旦第一个偏移位置距离配置的领导层距离更远,迭代就会停止。

碰撞检测功能将得到扩展,以考虑这些附加约束:

  • 标签不能与现有的引线冲突,引线也不能与现有标签冲突。请注意,这些碰撞检测操作在标签本身的边界框上,而不考虑标签缓冲区(即,允许引导线穿过现有标签周围的缓冲区)。

  • 引线不能与另一条引线相交。

  • 原始位置在边缘缓冲区内的标签不能加括号,因为这将导致为平铺输出呈现工件。

如果放置了带括号的标签,则原始位置和带括号位置之间的线将以具有“labelleader”geomtransform的标签样式呈现。

2.1预期问题

  • 使用RFC77的每个特征的多个标签,偏移量应该作为一个整体应用到特征的所有标签上。从这个意义上讲,前导参数应该属于Classobj,而不是Labelobj,这在语义上很难理解。

  • 对于带有labelpnt geomtransform的标签,应该在原始标签点或标签放在其偏移位置呈现标记吗?这可能需要额外的标签样式geomtransform。

  • 这个功能的计算代价很高,因为标签碰撞函数的调用频率比以前高很多。gridstep和maxDistance参数允许减少迭代次数,因此可以调用碰撞检测的次数,代价是忽略一些潜在的正确的偏移位置。请注意,网格步数为1,最大距离为图像大小时,可能会对图像中的每个像素进行碰撞测试。合理的值是5个像素的网格步距和30个像素的最大距离。

三。实施细节

将在maplabel.c中添加一个函数,以根据已呈现的标签测试labelcache成员配置的偏移位置。将添加一个配置选项(tbd),并调用此函数:

  • 一旦标签未在其原始位置上成功呈现,则立即

  • 标签优先级循环完成后。在这种情况下,将为当前优先级阶段的所有未成功标签调用该函数。

labelcache成员对象将添加两个成员,即包含前导线的lineobj和表示未缓冲标签边界框的shapeobj。

将扩展测试与现有标签碰撞的功能,以检查引线和未缓冲现有标签之间的交叉点。

3.1。受影响的文件

  • mapserver.h:labelcachememberobj和labelobj的附加成员

  • mapfile.c,maplexer.*,mapcopy.c:解析和实用程序函数

  • maplabel.c:mstestlabelcachecollisions中的其他碰撞测试

  • MpDigab. C:

    • 用于在偏移位置尝试标签的函数

    • 在msdrawlabelcache中调用此函数

3.2臭虫ID

4。向后兼容性问题

不需要,新功能。

5。错误报告

除了分析错误,没有其他错误报告。

6。示例用法

TBD。

7。投票历史

+1来自托马斯布、米克斯、史蒂文、丹尼尔、史蒂文、杰夫姆、佩林和塔玛斯