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):
- Refreshing makers (ClusterItems) en Google Maps v2 para Android
- Cómo agregar la ventana de información para el marcador de clustering en android?
- Android maps utils cluster icon color
- Cómo mostrar InfoWindow con Android Maps Utility Library para Android
- DefaultClusterRenderer getMarker () devuelve null cuando se hace zoom
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?
- Andorid Google mapa muestra marcador personalizado y problema de agrupación
- Maps de Android ClusteredMarkers - no muestran unclustered?
- Utilidad de Google Maps: cómo obtener todos los marcadores de ClusterManager <?>?
- Android setOnMarkerClickListener establecer título para cada marcador
- Marcadores de clúster en Google Maps Android v2
- Mostrar la información personalizada de InfoWindow para Android Maps Utility Library for Android
- Cómo centrar el texto en android IconGenerator
- ClusterManager en GoogleMap android
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; } } });
- Cómo averiguar cuándo se completa una instalación
- cómo obtener metadatos de una radio en línea de streaming