Agrupar los marcadores de mapa en el zoom hacia afuera y el desenclavamiento en el zoom

Estoy usando Google Maps Android clustering Utitlity Con los servicios de Google Maps v2 play.

No estoy recibiendo el comportamiento que esperaba. Como se puede ver en las dos imágenes de abajo, cuando se amplía, puedo ver un grupo de 20 y un solo marcador hacia arriba a la izquierda, pero cuando hago zoom hasta que están encima uno del otro no los estoy viendo. el grupo 20 todavía dice 20 y no 21?

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

¿Es ese comportamiento esperado? ¿Hay una manera puede hacer que el cluster mostrar 21 en lugar de 20 +

Este es el comportamiento predeterminado especificado en DefaultClasterRenderer#onBeforeClusterRendered() :

 /** * Called before the marker for a Cluster is added to the map. * The default implementation draws a circle with a rough count of the number of items. */ protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) { int bucket = getBucket(cluster); BitmapDescriptor descriptor = mIcons.get(bucket); if (descriptor == null) { mColoredCircleBackground.getPaint().setColor(getColor(bucket)); descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket))); mIcons.put(bucket, descriptor); } // TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often) markerOptions.icon(descriptor); } 

Tenga en cuenta que el texto del marcador se elige en función del bucket , en lugar del número exacto de elementos del cluster

La solución rápida para eso sería modificar la creación de descriptor para que se parezca a:

 descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator. makeIcon(cluster.getSize()); 

Por supuesto, puede implementar su ClasterRenderer personalizado y proporcionarlo al ClusterManager . De esta manera usted estará a cargo de la prestación de sus marcadores, pero si desea cambiar sólo el "20+" a "21" – Yo iría con el primer enfoque

EDITAR:

Pregunta de dirección en los comentarios: Si desea aumentar / disminuir el umbral de distancia para agrupar elementos, puede modificar el algoritmo predeterminado utilizado para la agrupación. Simplemente juegue con esta constante (en su caso debería ser menor):

 public static final int MAX_DISTANCE_AT_ZOOM = 100; // essentially 100 dp. 

Pero la corrección correcta sería tener en cuenta el tamaño de mapa de bits de marcador en lugar de valor constante. Supongo que Mr. Broadfood dejó eso como una tarea para los entusiastas 🙂

 private Bounds createBoundsFromSpan(Point p, double span) { // TODO: Use a span that takes into account the visual size of the marker, not just its // LatLng. double halfSpan = span / 2; return new Bounds( px - halfSpan, px + halfSpan, py - halfSpan, py + halfSpan); } 

Me doy cuenta de que esta es una vieja pregunta, pero para aquellos que siguen usando la excelente respuesta de Pavel, también asegúrese de que cambie estas dos líneas de código

 BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); ... mIcons.put(bucket, descriptor); 

reemplazando el cubo de la siguiente manera:

 BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); ... mIcons.put(cluster.getSize(), descriptor); 

De lo contrario, los grupos se redondearán al tamaño de cubo más cercano al fusionar / separar lo que resultará en tamaños de cubo inexactos.

Una especie de solución obvia, pero muy fácil de perder si usted no está prestando atención a los valores exactos de sus datos.

Para cualquiera que esté luchando:

La forma más sencilla de implementar la respuesta de Pavel mientras se conserva el algoritmo de renderizado de Google es descargar el renderizador predeterminado (como vinculado en Correct Answer), modificar el código y configurarlo como renderizador personalizado para ClusterManager. La biblioteca no es amigable con la modificación externa / sobrescritura, y es un dolor colosal en el extremo de sobrescribir sólo este segmento, ya que utiliza tantos otros métodos privados y variables.

Puede cambiar el tamaño mínimo del clúster. Por defecto, el tamaño mínimo del clúster es 4 definido en la biblioteca map-utils como se muestra a continuación.

  /** * If cluster size is less than this size, display individual markers. */ private int mMinClusterSize = 4; /** * Determine whether the cluster should be rendered as individual markers or a cluster. */ protected boolean shouldRenderAsCluster(Cluster<T> cluster) { return cluster.getSize() > mMinClusterSize; } 

O puede anular el método shouldRenderAsCluster en su clase extendida de DefaultClusterRenderer como se muestra a continuación:

 @Override protected boolean shouldRenderAsCluster(Cluster cluster) { // Always render clusters. return cluster.getSize() > 1; } 

Para alguien que está luchando para hacer lo mismo .. en su procesador personalizado sobrescribir estas dos funciones como a continuación @Override protected int getBucket (clúster cluster) {return cluster.getSize (); }

 @Override protected String getClusterText(int bucket) { return String.valueOf(bucket); } 
  • Marcador personalizado en google maps en android con vector icono de activo
  • Los datos de tráfico se muestran por encima de las formas dibujadas (polilíneas) en Android Google Maps API v2
  • Configuración de un LongClickListener en un marcador de mapa
  • Cómo realizar la operación de clic en la ventana de información personalizada de marcador en google map V2 en android
  • Android: ¿cómo notificar la actividad cuando las vistas de Fragmentos están listas?
  • No se puede reemplazar el fragmento dentro de la pestaña por otro fragmento
  • Hacer polígonos que se pueden hacer clic en Google Maps (para Android)
  • Google Maps API V2 Zoom a la ubicación actual
  • Android mapa api-2 deshabilitar haga clic
  • Cómo dibujar Polyline interactivo en la ruta google maps v2 android
  • Google Maps Geolocation api: acceso no configurado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.