在我们的应用程序中,我们使用谷歌地图API v1。 我为标记写了基于网格的聚类(总数达到几千)。一切都很好 - 性能良好等等...... 唯一的问题是我根据当前查看的区域计算网格
private void createCluster2DArray() {
double cwidth = (cachedrightLongitude - cachedleftLongitude) / clustersXnum;
double cheight = (cachedtopLatitude - cachedbottomLatitude) / clustersYnum;
for (int i = 0; i < clustersXnum; i++) {
for (int j = 0; j < clustersYnum; j++) {
Cluster cluster;
if (clusters[i][j] == null) {
cluster = new Cluster();
clusters[i][j] = cluster;
} else {
cluster = clusters[i][j];
cluster.list.clear();
}
//calculate dimensions
cluster.left = cachedleftLongitude + i * cwidth;
cluster.right = cluster.left + cwidth;
cluster.bottom = cachedbottomLatitude + j * cheight;
cluster.top = cluster.bottom + cheight;
cluster.calculateCenter(mMapView);
}
}
}
cachedrightLongitude, cachedrightLongitude, cachedrightLongitude, cachedrightLongitude
是设备屏幕区域的边界,以度为单位。
您可以看到,问题是每次用户更改可见区域时更改群集边框(更改缩放级别,或只是滑动屏幕)。这会导致聚类重新计算并在其上重新分配标记。
我看到的唯一解决方案是为每个缩放级别创建一些静态屏幕独立的群集贪婪(例如,在缩放级别5,群集的大小将是10milli度,而在6级时它将是2milli度,因此仅border-clusters将动态地改变它们的大小和外边界。我对吗?
还有其他建议吗?
答案 0 :(得分:1)
对于android maps API v1,这里有一个聚类库:https://github.com/damianflannery/Polaris。这是Cyril Mottier的Polaris库的一个分支,但关于pull请求的讨论表明它不会合并回原始版本。 See here。我没有查看源代码,所以我不能告诉你他们是否使用了网格聚类。
至于你的问题,我认为使用静态屏幕独立的集群网格是可行的方法。我只建议改变millidegrees的值。对于相差1的缩放级别,应将millidegs除以(或乘以)2。
另请注意,对于纬度,您不能直接使用度数值,但必须通过墨卡托投影推送它。这是为了使网格由正方形组成,而不是让它们看起来像矩形,其高度比靠近北极和南极的宽度大几倍。
这基本上是我在地图API v2的Android Maps Extensions中所做的。 我在缩放级别0上假定180度网格尺寸,因此在缩放级别1上为90度,在2上为45等,在缩放21上为约85微度。可以在API中更改该值。
对于您来说,Extensions lib代码中最有用的部分是:SphericalMercator来转换纬度,而部分来自GridClusteringStrategy。