google - marker android studio
¿El Administrador de clústeres de la utilidad de la API de Android de Google Maps tiene un número mínimo de marcadores antes de crear un clúster? (1)
ACTUALIZACIÓN (3 años después de la publicación de la respuesta original: D)
Como lo señaló @schaenk, DefaultClusterRenderer
ahora tiene el setMinClusterSize(int)
que hace lo mismo.
RESPUESTA ORIGINAL
La clase responsable de tomar una decisión sobre agrupar / no agrupar un elemento es DefaultClusterRenderer
. Si observa el método DefaultClusterRenderer#shouldRenderAsCluster()
, verá que comienza a agruparse en clústeres solo cuando el tamaño del clúster es> MIN_CLUSTER_SIZE
. En nuestro caso MIN_CLUSTER_SIZE = 4
.
Desafortunadamente, no puede cambiar esta constante de forma dinámica, por lo que necesita extender la clase DefaultClusterRenderer
y anular el método shouldRenderAsCluster()
para proporcionar su propia lógica:
class CustomRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T>
{
public CustomRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
super(context, map, clusterManager);
}
@Override
protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
//start clustering if at least 2 items overlap
return cluster.getSize() > 1;
}
}
private void setUpMapIfNeeded() {
if (mMap != null) {
return;
}
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
if (mMap != null) {
mClusterManager = new ClusterManager<Place>(this, mMap);
mClusterManager.setRenderer(new CustomRenderer<Place>(this, mMap, mClusterManager));
........
}
}
Estoy utilizando la biblioteca de la utilidad de la API de Android de Google Maps para habilitar la agrupación en clústeres en mi aplicación. Cuando se coubican cinco o más marcadores, se crea un clúster:
Cuatro o menos marcadores de ubicación similar no crearán un grupo:
¿Es esto por diseño o estoy haciendo algo mal, porque mis mapas tienen 2, 3 o 4 marcadores que se superponen claramente, pero no forman un grupo?
El código para demostrar el problema:
Diseño del mapa:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
Actividad:
package com.example.android.clusteringminima;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.clustering.ClusterItem;
import com.google.maps.android.clustering.ClusterManager;
public class ClusteringMinimaTest extends FragmentActivity {
private GoogleMap mMap;
private ClusterManager<Place> mClusterManager;
public class Place implements ClusterItem {
private final LatLng mPosition;
public Place(double lat, double lng) {
mPosition = new LatLng(lat, lng);
}
@Override
public LatLng getPosition() {
return mPosition;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
if (mMap != null) {
return;
}
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
if (mMap != null) {
mClusterManager = new ClusterManager<Place>(this, mMap);
mMap.setOnCameraChangeListener(mClusterManager);
// Cluster of 4 or 5
mClusterManager.addItem(new Place(51.471524, -0.454280));
mClusterManager.addItem(new Place(51.471311, -0.452257));
mClusterManager.addItem(new Place(51.471510, -0.453514));
mClusterManager.addItem(new Place(51.471710, -0.453714));
// Remove this item to create a group of four
mClusterManager.addItem(new Place(51.471810, -0.453714));
// Cluster of 9 (depending on zoom level)
mClusterManager.addItem(new Place(51.517399, -0.177480));
mClusterManager.addItem(new Place(51.509899, -0.134180));
mClusterManager.addItem(new Place(51.495708, -0.144370));
mClusterManager.addItem(new Place(51.496112, -0.144162));
mClusterManager.addItem(new Place(51.512458, -0.118644));
mClusterManager.addItem(new Place(51.518600, -0.081300));
mClusterManager.addItem(new Place(51.530449, -0.125480));
mClusterManager.addItem(new Place(51.513008, -0.088430));
mClusterManager.addItem(new Place(51.505001, -0.086000));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.5, -0.35), 9));
}
}
}