我需要解决在地图上以准确,可读和快速的方式标记数千个项目的问题,即使用户缩小以使标记以令人困惑的方式重叠。这是一个Android MapView
,但我的问题更为笼统。
我知道Fluster,grid-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)的概率复杂度相同,但我的猜测是它在实践中会更快。
问题: