0

在我们的应用程序中,我们使用 google map APIs 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 时,集群的大小将为 10 度,在级别 6 时为 2 度,所以只有边界集群将动态改变它们的大小和外部边界)。我对吗?

还有其他建议吗?

4

1 回答 1

1

对于 android maps API v1,这里有一个聚类库:https ://github.com/damianflannery/Polaris 。这是 Cyril Mottier 的 Polaris 库的一个分支,但关于拉取请求的讨论表明它不会合并回原始库。见这里。我没有查看源代码,所以我无法告诉您他们是否使用网格聚类。

至于你的问题,我认为使用静态屏幕独立集群网格是要走的路。我只建议更改毫度的值。对于相差 1 的缩放级别,millidegs 应除以(或乘以)2。

另请注意,对于纬度,您不能直接使用度数值,但您必须通过墨卡托投影来推动它。这是为了使网格由正方形组成,而不是让它们看起来像矩形,其高度比宽度更接近北极和南极。

这基本上是我在Android Maps Extensions for maps API v2 中所做的。我假设缩放级别 0 上的网格大小为 180 度,因此缩放级别 1 上为 90 度,缩放级别 2 上为 45 度等,缩放级别 21 上约为 85 微度。可以在 API 中更改该值。

对您而言,Extensions lib 中最有用的代码部分是:SphericalMercator用于转换纬度和GridClusteringStrategy中的某些部分。

于 2013-05-02T09:24:22.050 回答