Agrupamiento de mapas: los marcadores de zoom máximo siguen agrupados

Estoy utilizando mapas android utils para agrupar los marcadores en google maps api v2. Funcionó bien, pero cuando agregué 2000 + marcadores, en el zoom máximo todavía está agrupado (los marcadores todavía tienen números):

2000+ marcadoreszoom máximo

Aquí está mi método para llenar mapa con marcadores:

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); } 

¿Alguien puede ayudarme? ¿Por qué no funciona?

Puede extender la clase DefaultClusterRenderer y establecer marcadores mínimos en el clúster.

 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 } } 

Para filtrar los marcadores que tienen la misma posición, simplemente podría usar un hashmasp, cuya clave se calcula a partir de las coordenadas del marcador.

Algo como:

 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); // ... } 

A través de la pista y el error, encontré que si los marcadores están dentro de ~ 10 pies (equivalente a 0,0000350 º diferencia en lat o largo), los marcadores no decluster incluso en el nivel de zoom máximo.

Una forma de resolver este problema es implementar un renderizador personalizado y dejar que la aplicación decida cuándo se agrupará. Por ejemplo, el siguiente código se agrupará sólo cuando haya más de un marcador y no un máximo de Zoom. En otras palabras, se descomponen todos los marcadores en el zoom máximo.

 mClusterManager.setRenderer(new DefaultClusterRenderer<MyItem>(mContext, googleMap, mClusterManager) { @Override protected void boolean shouldRenderAsCluster(Cluster cluster) { if(cluster.getSize() > 1 && mCurrentZoom < mMaxZoom) { return true; } else { return false; } } }); 
  • Android, devolución de llamada cuando se completa el agrupamiento de mapas
  • Mejores prácticas al agrupar gran cantidad de marcadores en Google Maps Android V2
  • Cómo actualizar marcadores en el mapa cuando se utiliza ClusterManager
  • Marcadores de clúster superpuestos por el icono de ubicación actual del usuario en Android
  • Google Map vs. Administrador de clústeres: onCameraChangeListener obsoleto
  • ¿Cómo agregar título, fragmento e icono a ClusterItem?
  • La adición de nuevos marcadores en el mapa utilizando el gestor de clúster no refleja los cambios hasta que haga zoom y aleje el mapa
  • Google maps api v2 fuera de error de memoria
  • Cómo configurar mi propio icono de marcadores en clúster en Google Maps
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.