2013-05-02 46 views
0

在我們的應用中,我們使用谷歌地圖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度,所以只有邊界羣將動態地改變它們的大小和外部邊界)。我對嗎?

還有其他建議嗎?

回答

1

對於android maps API v1,這裏有一個集羣庫:https://github.com/damianflannery/Polaris。這是Cyril Mottier的北極星圖書館的一個分支,但關於拉取請求的討論表明它不會被合併回原來的。 See here。我沒有看過源代碼,所以我不能告訴你他們是否使用網格集羣。

至於你的問題,我認爲使用靜態屏幕獨立的集羣網格是要走的路。我只建議改變毫眼的數值。對於不同的縮放級別,millidegs應該被除以2(或乘以)。

另請注意,緯度不能直接使用度數值,但必須通過墨卡託投影來推送它。這是爲了使網格由正方形組成,而不是使它們看起來像高度比寬度更接近北極和南極的幾倍的矩形。

這基本上是我在Android Maps Extensions地圖API v2中做的。 我在縮放級別0上假定網格大小爲180度,因此在縮放級別1上爲90度,在2上爲45等,在縮放21上約爲85度。該值可以在API中更改。

對於來自Extensions lib的代碼最有用的部分是:SphericalMercator來轉換緯度和GridClusteringStrategy的某些部分。

+0

Wielkiedzięki,Maciej。你的回答非常有幫助。 – 2013-05-03 06:45:17