【问题标题】:Arrange labels on a map so that they don't overlap在地图上排列标签,使它们不重叠
【发布时间】:2014-10-12 11:26:56
【问题描述】:

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

我想用一条指向它们位置的线来显示标签,例如这里:

但是,我想不出一种有效的算法来计算线条所需的角度,从而使所有标签都不重叠。在标签大小不变的情况下,地图也是可缩放的;因此,所需的角度将随缩放级别而变化。

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

【问题讨论】:

  • 看起来工作量很大。我只是使用一个标记集群。
  • 您好,谢谢您的建议。这实际上是一个好主意。我会调查的。

标签: android algorithm drawing


【解决方案1】:

一些建议:

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

  2. 结合 1. 与一个简单的贪心策略(为了提高效率):按优先级对标签进行排序(例如主要城市优先)。对于应该显示的每个标签,尝试多个位置(例如项目符号的左侧、右侧、顶部、底部)并选择第一个工作的位置(如果有)(并渲染标签)。

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

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

【讨论】:

  • 由于您还提到了某种标记集群,我将其标记为已回答。谢谢你的其他建议,我会和他们一起玩。
猜你喜欢
  • 2014-12-23
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多