Un poco atascado en este. Estoy recuperando una lista de coordenadas geográficas a través de JSON y las coloco en un mapa de Google. Todo funciona bien, excepto en el caso de que tenga dos o más marcadores en el mismo lugar exacto. La API solo muestra 1 marcador: el superior. Esto es lo suficientemente justo, supongo, pero me gustaría encontrar una manera de mostrarlos todos de alguna manera.
Busqué en Google y encontré algunas soluciones, pero en su mayoría parecen ser para V2 de la API o simplemente no tan buenas. Idealmente, me gustaría una solución en la que haga clic en algún tipo de marcador de grupo y luego muestre los marcadores agrupados alrededor del lugar en el que están todos.
¿Alguien tuvo este problema o similar y le gustaría compartir una solución?
fuente
OverlappingMarkerSpiderfier
en combinación con MarkerClusterer, una buena opción es establecer lamaxZoom
opción en el constructor del clúster. Esto "desagrupa" los marcadores después del nivel de zoom especificado.Desplazar los marcadores no es una solución real si están ubicados en el mismo edificio. Lo que podría querer hacer es modificar el marcadorclusterer.js así:
Agregue un método de clic de prototipo en la clase MarkerClusterer, así; lo anularemos más adelante en la función initialize () del mapa:
En la clase ClusterIcon, agregue el siguiente código DESPUÉS del activador clusterclick:
Luego, en su función initialize () donde inicializa el mapa y declara su objeto MarkerClusterer:
Donde multiChoice () es SU función (aún por escribir) para abrir una ventana de información con una lista de opciones para seleccionar. Tenga en cuenta que el objeto markerClusterer se pasa a su función, porque lo necesitará para determinar cuántos marcadores hay en ese clúster. Por ejemplo:
fuente
Usé esto junto con jQuery y hace el trabajo:
fuente
Ampliando la respuesta de Chaoley , implementé una función que, dada una lista de ubicaciones (objetos con
lng
ylat
propiedades) cuyas coordenadas son exactamente iguales, los aleja un poco de su ubicación original (modificando objetos en su lugar). Luego forman un bonito círculo alrededor del punto central.Descubrí que, para mi latitud (52 grados norte), 0,0003 grados de radio de círculo funcionan mejor, y que debes compensar la diferencia entre los grados de latitud y longitud al convertirlos a kilómetros. Puede encontrar conversiones aproximadas para su latitud aquí .
fuente
37.68625400000000000,-75.71669800000000000
a37.686254,-75.716698
también, que es el mismo para todos los valores ... M esperando algo como ...37.68625400000000000,-75.71669800000000000
to37.6862540000001234,-75.7166980000001234
37.6862540000005678,-75.7166980000005678
..etc .. También intenté cambiar mi ángulo.La respuesta más excelente de @Ignatius, actualizada para funcionar con la v2.0.7 de MarkerClustererPlus.
Agregue un método de clic de prototipo en la clase MarkerClusterer, así; lo anularemos más adelante en la función initialize () del mapa:
En la clase ClusterIcon, agregue el siguiente código DESPUÉS del activador click / clusterclick:
Luego, en su función initialize () donde inicializa el mapa y declara su objeto MarkerClusterer:
Donde multiChoice () es SU función (aún por escribir) para abrir una ventana de información con una lista de opciones para seleccionar. Tenga en cuenta que el objeto markerClusterer se pasa a su función, porque lo necesitará para determinar cuántos marcadores hay en ese clúster. Por ejemplo:
fuente
maxZoom
problema, creo que esto solo es un problema si no hay un conjunto de maxZoom o el maxZoom para el clúster es mayor que el zoom para el mapa. Reemplacé su código fijo con este fragmento y parece funcionar bien:var maxZoom = mc.getMaxZoom(); if (null === maxZoom || maxZoom > mc.getMap().maxZoom) { maxZoom = mc.getMap().maxZoom; if (null === maxZoom) { maxZoom = 15; } }
clickedCluster.center_.lat()
/clickedCluster.center_.lng()
Las respuestas anteriores son más elegantes, pero encontré una forma rápida y sucia que realmente funciona realmente increíblemente bien. Puede verlo en acción en www.buildinglit.com
Todo lo que hice fue agregar un desplazamiento aleatorio a la latitud y longitud a mi página genxml.php para que devuelva resultados ligeramente diferentes cada vez con desplazamiento cada vez que se crea el mapa con marcadores. Esto suena como un truco, pero en realidad solo necesita que los marcadores se muevan un ligero empujón en una dirección aleatoria para que se pueda hacer clic en el mapa si se superponen. De hecho, funciona muy bien, yo diría que mejor que el método araña porque ¿quién quiere lidiar con esa complejidad y hacer que salten por todas partes? Solo desea poder seleccionar el marcador. Empujarlo al azar funciona perfecto.
Aquí hay un ejemplo de la creación del nodo de iteración de la declaración while en mi php_genxml.php
Observe que debajo de lat y long está el desplazamiento +. de las 2 variables anteriores. Tuve que dividir al azar por 0,1000 por 10000000 para obtener un decimal que fuera lo suficientemente pequeño al azar como para mover apenas los marcadores. Siéntase libre de jugar con esa variable para obtener una que sea más precisa para sus necesidades.
fuente
Para situaciones en las que hay varios servicios en el mismo edificio, puede compensar los marcadores solo un poco (por ejemplo, en 0,001 grados) en un radio desde el punto real. Esto también debería producir un efecto visual agradable.
fuente
Esta es más una solución provisional "rápida y sucia" similar a la que sugiere Matthew Fox, esta vez usando JavaScript.
En JavaScript, puede compensar la latitud y la longitud de todas sus ubicaciones agregando una pequeña compensación aleatoria a ambas, por ejemplo
myLocation[i].Latitude+ = (Math.random() / 25000)
(Encontré que dividir por 25000 da suficiente separación pero no mueve el marcador significativamente de la ubicación exacta, por ejemplo, una dirección específica)
Esto hace un trabajo razonablemente bueno al compensarlos entre sí, pero solo después de haber acercado el zoom de cerca. Cuando se aleja, aún no estará claro que hay múltiples opciones para la ubicación.
fuente
Echa un vistazo a Marker Clusterer para V3: esta biblioteca agrupa los puntos cercanos en un marcador de grupo. El mapa se acerca cuando se hace clic en los grupos. Sin embargo, me imagino que cuando se amplía el zoom, todavía tendrá el mismo problema con los marcadores en el mismo lugar.
fuente
Actualizado para trabajar con MarkerClustererPlus.
fuente
Me gustan las soluciones simples, así que aquí está la mía. En lugar de modificar la biblioteca, lo que haría más difícil mantener. simplemente puedes ver el evento así
entonces puedes administrarlo en
Yo, es decir, usé bootstrap para mostrar un panel con una lista. que encuentro mucho más cómodo y utilizable que hacer spiderfying en lugares "llenos de gente". (si está utilizando un clusterer, es probable que termine con colisiones una vez que se arme). también puedes comprobar el zoom allí.
por cierto. Acabo de encontrar un folleto y parece funcionar mucho mejor, el clúster Y spiderfy funciona de manera muy fluida http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html y es de código abierto.
fuente
Verifique esto: https://github.com/plank/MarkerClusterer
Este es el MarkerCluster modificado para tener una ventana de información en un marcador de clúster, cuando tiene varios marcadores en la misma posición.
Puedes ver cómo funciona aquí: http://culturedays.ca/en/2013-activities
fuente
Ampliando las respuestas dadas anteriormente, solo asegúrese de configurar la opción maxZoom al inicializar el objeto del mapa.
fuente
Dar un desplazamiento alejará los marcadores cuando el usuario se acerque al máximo. Así que encontré una manera de lograrlo. Puede que esta no sea la forma adecuada, pero funcionó muy bien.
configure el zIndex del marcador para que vea el icono del marcador que desea ver en la parte superior; de lo contrario, animará los marcadores como un intercambio automático. cuando el usuario toca el marcador, maneja el zIndex para traer el marcador en la parte superior usando zIndex Swap.
fuente
Cómo salirse con la suya ... [Swift]
¿Está a punto de crearse un nuevo marcador? comprobar
clusterArray
y manipular su desplazamientoresultado
fuente
Agregando a la astuta respuesta del genio de Matthew Fox, he agregado un pequeño desplazamiento aleatorio a cada lat y lng al configurar el objeto marcador. Por ejemplo:
fuente
Ampliando las respuestas anteriores, cuando tenga cadenas unidas, no una posición agregada / restada (por ejemplo, "37.12340-0.00069"), convierta su latitud / longitud original en flotantes, por ejemplo, usando parseFloat (), luego agregue o reste correcciones.
fuente