2014-06-11 49 views
3

我正在使用android maps utils來聚合google map api v2上的標記。它工作得很好,但是當我加2000+的標記,在最大放大它仍然是羣集(標記仍然有號碼):地圖集羣 - 最大縮放標記仍然聚集

2000+ markers max zoom

這裏是我用彩筆填圖方法:

public void getRiverData(String state, String type) { 
    URL = getResources().getString(R.string.base_url) + state + "/" + type 
      + getResources().getString(R.string.end_url); 
    SimpleXmlRequest<XMLData> simpleRequest = new SimpleXmlRequest<XMLData>(
      URL, XMLData.class, new Response.Listener<XMLData>() { 

       @Override 
       public void onResponse(XMLData response) { 

        // Initialize the manager with the context and the map. 
        // (Activity extends context, so we can pass 'this' in 
        // the constructor.) 
        mClusterManager = new ClusterManager<MarkerItem>(
          getActivity(), map); 

        mClusterManager.setRenderer(new ClusterRenderer(
          getActivity(), map, mClusterManager)); 

        // response Object 
        waterItemsList = response.getNews(); 

        for (News item : waterItemsList) { 
         if (item.getRiver_name() != null 
           && item.getRiver_name() != "") { 

          water_level_value = item.getWater_level_value(); 

          if (water_level_value != null 
            && !water_level_value.equals(0) 
            && !water_level_value.equals("")) { 

           MarkerItem offsetItem = new MarkerItem(item); 
           mClusterManager.addItem(offsetItem); 

          } 

          map.setOnMarkerClickListener(mClusterManager); 

          map.setInfoWindowAdapter(new InfoWindowAdapter() { 

           @Override 
           public View getInfoWindow(Marker marker) { 

            return null; 
           } 

           @Override 
           public View getInfoContents(Marker marker) { 

            try { 
             View v = getActivity() 
               .getLayoutInflater() 
               .inflate(
                 R.layout.marker_info, 
                 null); 
             TextView title = (TextView) v 
               .findViewById(R.id.tvMarkerTitle); 
             TextView info = (TextView) v 
               .findViewById(R.id.tvMarkerInfo); 

             title.setText(marker.getTitle() 
               .toString()); 
             info.setText(marker.getSnippet() 
               .toString()); 
             return v; 
            } catch (Exception e) { 
             // kliknięcie w cluster 
             return null; 

            } 

           } 
          }); 

         } 

        } 

        map.setOnCameraChangeListener(mClusterManager); 

        map.setOnInfoWindowClickListener(mClusterManager); 

        mClusterManager.cluster(); 

       } 

      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // error Object 
        error.printStackTrace(); 
       } 
      }); 

    AppController.getInstance().addToRequestQueue(simpleRequest); 
} 

任何人都可以幫我嗎?爲什麼它不起作用?

+2

我認爲這是由於(7)標記具有相同的位置。 –

+0

它可能是。是否有任何方法檢查具有相同位置的標記是否存在? – dudeck

+1

只要做到這一點:給你的地圖7標記完全相同的位置,以測試它的行爲。並給它7個標記略有不同的位置(+/- 0.0001緯度/經度),看看它是否工作。 –

回答

1

要篩選具有相同位置的標記,可以簡單地使用一個hashmasp,其關鍵值是從標記座標計算得出的。

喜歡的東西:

Map<String, Marker> uniqueMarkers = new HashMap<String, Marker>(); 
for (Markers m : allMarkers) { 
    // Compute a key to filter duplicates 
    // You may need to account for small floating point precision errors by 
    // rounding those coordinates 
    String key = m.getLatitude() + "|" + m.getLongitude(); 

    if (uniqueMarkers.get(key)!=null) { 
    // Skip if we have a marker with the same coordinates 
    continue; 
    } 

    // Add marker and do something with it 
    uniqueMarkers.add(key, m); 

    // ... 
} 
13

你可以擴展DefaultClusterRenderer類,並設定最低標記,以集羣。

public class InfoMarkerRenderer extends DefaultClusterRenderer<MyCustomMarker> { 

public InfoMarkerRenderer(Context context, GoogleMap map, ClusterManager<MyCustomMarker> clusterManager) { 
    super(context, map, clusterManager); 
    //constructor 
} 

@Override 
protected void onBeforeClusterItemRendered(final MyCustomMarker infomarker, MarkerOptions markerOptions) { 
     // you can change marker options 
} 

@Override 
protected boolean shouldRenderAsCluster(Cluster cluster) { 
    return cluster.getSize() > 5; // if markers <=5 then not clustering 
} 
} 
+0

這種方法很好。您可以使用更復雜的測試來確定是否要羣集。 – rfay

0

通過試錯我發現,如果標記是內〜10英尺(相當於0.0000350º在緯度或長差),標記甚至沒有在最大縮放級別decluster。

解決此問題的一種方法是實現自定義渲染器並讓應用程序決定何時進行羣集。例如,下面的代碼只會在多於1個標記且不在最大縮放時纔會聚集。換句話說,它將在最大變焦範圍內使所有標記消失。

mClusterManager.setRenderer(new DefaultClusterRenderer<MyItem>(mContext, googleMap, mClusterManager) { 
    @Override 
    protected boolean shouldRenderAsCluster(Cluster cluster) { 
     if(cluster.getSize() > 1 && mCurrentZoom < mMaxZoom) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
});