MS RFC 81:带引线的偏移标签¶
- 日期
2011/12/15
- 作者
托马斯堡
- 联系方式
t在terriscope.fr的端口
- 状态
采用
- 版本
MapServer 6.2
1。概述¶
当前标签方案将标签文本放置在它们所附着的点附近。在labelcache阶段,根据标签的位置,测试一个或九个标签位置,如果所有这些位置都与已渲染的标签发生冲突,则放弃标签。
此RFC建议扩展为给定标签测试的位置数量,并从呈现的文本到标签附加到的实际位置呈现一条引线。
建议更改的示例呈现可以是:
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中的其他碰撞测试
mapdraw.c:
用于在偏移位置尝试标签的函数
在msdrawlabelcache中调用此函数
4。向后兼容性问题¶
不需要,新功能。
5。错误报告¶
除了分析错误,没有其他错误报告。
6。示例用法¶
TBD。
7。投票历史¶
+1来自托马斯布、米克斯、史蒂文、丹尼尔、史蒂文、杰夫姆、佩林和塔玛斯