在地图叠加层中消除冲突标记

时间:2012-07-31 20:09:03

标签: android android-mapview google-maps-markers hierarchical-clustering

我需要解决在地图上以准确,可读和快速的方式标记数千个项目的问题,即使用户缩小以使标记以令人困惑的方式重叠。这是一个Android MapView,但我的问题更为笼统。

我知道Flustergrid-based schemes和各种启发式方法。

这些算法似乎不准确,因为群集标记与质心不对应。我的应用程序是安全关键的,标记相当大,所以近似值不够好。

在我发明了一种算法之后,我才知道它是在80年代首次使用的。它的正确描述是"agglomerative hierarchical geometric centroid clustering."伪码如下:

-- Greedy hierarchical clustering
given R the clearance radius of markers 
let S be a set, initially singleton clusters containing exactly one marker each
loop
  let <a,b> be the pair of clusters in S with closest centroids, distance d apart; (1)
  if d >= 2R, exit the loop;
  remove a and b from S;
  insert new Cluster(a union b) into S;
end loop;

现在在每个群集的质心处绘制一个标记。

我使用了一个可更新的Delaunay三角剖分和一个优先级队列来使(1)有效,但最近发现带有删除的kd-tree 也可以工作。 DT算法与kd-trees(O(n log n)average)的概率复杂度相同,但我的猜测是它在实践中会更快。

问题:

  • 是否有更好的查找群集的算法?贪婪算法可以产生比按照最小量分离标记所需的更少的簇。找到最大的一组可能是NP难。是否比贪婪更好的启发式?
  • 是否值得尝试使用kd-tree代替Delaunay三角测量?快速平板电脑上10,000个节点的DT性能很差:缩放后最多2秒。
  • 是否存在将标记放置在群集质心处的包?

0 个答案:

没有答案