在地图上排列标签,使它们不重叠

时间:2014-10-12 11:26:57

标签: android algorithm drawing

在我的(Android)应用程序中,我正在显示一个带有一些标记对象的地图。当对象彼此非常接近时,标签会重叠,如本例中的图片(底部三个对象):

Example of overlapping labels

我想显示带有指向其位置的线条的标签,例如:

Non-overlapping labels

但是,我无法想到一种有效的算法,它可以计算所需的线条角度,使得所有标签都不会重叠。地图也可以缩放,而标签尺寸不会改变;因此,所需的角度将随缩放级别而变化。

是否有任何算法没有那么高的计算成本(即,我不需要计算每一帧中所有对象之间的碰撞),这可以帮助我在这里?或者我应该预先计算一些东西并将其与应用程序一起发货? (对象总是固定的)

1 个答案:

答案 0 :(得分:1)

一些建议:

  1. 使用空间分区数据结构(k-D树,四叉树)进行碰撞检测。这样可以避免强力碰撞计算。

  2. 将1.与简单的贪婪策略相结合(为提高效率):按优先级排序标签(例如首先是主要城市)。对于应显示的每个标签,尝试多个位置(例如子弹的左侧,右侧,顶部,底部)并选择第一个(如果有的话)(并渲染标签)。

  3. 对于参考点(子弹)在当前缩放级别空间非常接近的标签:仅对子弹进行第一次传递(碰撞检测和可能的渲染)。使用1.应该可以检测彼此接近的子弹并准备一个伪标签,将子弹的所有文本标签组合在一起(使用所需类型的基于行的布局)并且可以使用(带有碰撞检测+渲染传递为2的一些变化,如水平或垂直分组)。

  4. 通过这种方法,实际上不调整线之间的角度以避免碰撞。相反,计算是为了避免组内标签内的重叠,并与典型的碰撞检测相结合,以避免与其他标签重叠。