Esto es lo más simple que podría reducir a:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Google Maps Multiple Markers</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 500px; height: 400px;"></div>
<script type="text/javascript">
var locations = [
['Bondi Beach', -33.890542, 151.274856, 4],
['Coogee Beach', -33.923036, 151.259052, 5],
['Cronulla Beach', -34.028249, 151.157507, 3],
['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
['Maroubra Beach', -33.950198, 151.259302, 1]
];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: new google.maps.LatLng(-33.92, 151.25),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infowindow = new google.maps.InfoWindow();
var marker, i;
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
</script>
</body>
</html>
👨💻 Editar / bifurcar en un Codepen →
CAPTURA DE PANTALLA
Hay algo de magia de cierre al pasar el argumento de devolución de llamada al addListener
método. Este puede ser un tema bastante complicado si no está familiarizado con el funcionamiento de los cierres. Sugeriría consultar el siguiente artículo de Mozilla para una breve introducción si es el caso:
❯ Centro de desarrollo de Mozilla: trabajar con cierres
InfoWindow
a las propiedades del marcador y luego llamar.open()
a la ventana de información desde sí mismo. Hubiera publicado el cambio aquí, pero las modificaciones fueron tan grandes que publiqué mi propia respuesta .new MarkerClusterer()
para el busto de rendimiento masivo? Mira la respuesta de ChirsSwires.Este es otro ejemplo de marcadores múltiples que cargan con una única
title
yinfoWindow
texto. Probado con la última versión de Google Maps API V3.11.Captura de pantalla de 250 marcadores:
Aleatorizará automáticamente el Lat / Lng para que sea único. Este ejemplo será muy útil si desea probar 500, 1000, xxx marcadores y rendimiento.
fuente
infoWindow
para cada marcador y no ocultará el otroinfoWindow
si se muestra actualmente. es realmente útil :)new MarkerClusterer()
para una caída masiva de rendimiento? Mira la respuesta de ChirsSwires.Pensé que pondría esto aquí, ya que parece ser un punto de aterrizaje popular para aquellos que comienzan a usar las API de Google Maps. Múltiples marcadores representados en el lado del cliente es probablemente la caída de muchas aplicaciones de mapeo en cuanto al rendimiento. Es difícil comparar, corregir y, en algunos casos, incluso establecer que hay un problema (debido a las diferencias de implementación del navegador, el hardware disponible para el cliente, los dispositivos móviles, la lista continúa).
La forma más sencilla de comenzar a abordar este problema es utilizar una solución de agrupación de marcadores. La idea básica es agrupar ubicaciones geográficamente similares en un grupo con la cantidad de puntos mostrados. A medida que el usuario se acerca al mapa, estos grupos se expanden para mostrar marcadores individuales debajo.
Quizás la más simple de implementar es la biblioteca de marcador de marcadores . Una implementación básica sería la siguiente (después de las importaciones de la biblioteca):
Los marcadores en lugar de agregarse directamente al mapa se agregan a una matriz. Esta matriz se pasa a la biblioteca que maneja los cálculos complejos para usted y se adjunta al mapa.
Estas implementaciones no solo aumentan enormemente el rendimiento del lado del cliente, sino que en muchos casos conducen a una IU más simple y menos abarrotada y a una digestión más fácil de los datos en escalas más grandes.
Otras implementaciones están disponibles en Google.
Espero que esto ayude a algunos de los más nuevos en los matices del mapeo.
fuente
Versión asincrónica:
fuente
Ejemplo de trabajo completo. Simplemente puede copiar, pegar y usar.
fuente
De las muestras de API de Google Map :
fuente
Aquí hay otra versión que escribí para guardar el mapa de bienes raíces, que coloca el puntero de la ventana de información en el lat y largo real del marcador, mientras oculta temporalmente el marcador mientras se muestra la ventana de información.
También elimina la asignación estándar de 'marcador' y acelera el procesamiento al asignar directamente el nuevo marcador a la matriz de marcadores en la creación de marcadores. Sin embargo, tenga en cuenta que se han agregado propiedades adicionales tanto al marcador como a la ventana de información, por lo que este enfoque es un poco poco convencional ... ¡pero ese soy yo!
Nunca se menciona en estas preguntas de la ventana de información, que la ventana de información estándar NO SE coloca en el lat y lng del punto marcador, sino en la parte superior de la imagen del marcador. La visibilidad del marcador debe estar oculta para que esto funcione, de lo contrario, la API de Maps empujará el ancla de la ventana de información nuevamente a la parte superior de la imagen del marcador.
La referencia a los marcadores en la matriz de 'marcadores' se crea inmediatamente después de la declaración del marcador para cualquier tarea de procesamiento adicional que pueda desearse más tarde (ocultar / mostrar, agarrar las coordenadas, etc.). Esto ahorra el paso adicional de asignar el objeto marcador a 'marcador', y luego empujar el 'marcador' a la matriz de marcadores ... mucho procesamiento innecesario en mi libro.
De todos modos, una versión diferente de las ventanas de información, y espero que ayude a informarlo e inspirarlo.
Aquí hay un JSFiddle que funciona
Nota adicional
Notará en este dato de ejemplo de Google un cuarto lugar en la matriz de 'ubicaciones' con un número. Dado esto en el ejemplo, también podría usar este valor para la identificación del marcador en lugar del valor del bucle actual, de modo que ...
fuente
Respuesta aceptada, reescrita en ES6:
fuente
Enlace fuente
Enlace de demostración
Código HTML completo
fuente
closeOtherInfo
, no pude encontrar una solución decente para trabajar con Merkercluster hasta su respuesta. :)Agregar un marcador en su programa es muy fácil. Solo puede agregar este código:
Los siguientes campos son particularmente importantes y se establecen comúnmente cuando construye un marcador:
position
(obligatorio) especifica un LatLng que identifica la ubicación inicial del marcador. Una forma de recuperar un LatLng es mediante el uso del servicio de geocodificación .map
(opcional) especifica el mapa en el que colocar el marcador. Si no especifica un mapa en la construcción del marcador, el marcador se crea pero no se adjunta al mapa (ni se muestra en él). Puede agregar el marcador más tarde llamando alsetMap()
método del marcador .Nota en , en el ejemplo, el campo de título establece el título del marcador que aparecerá como información sobre herramientas.
Puede consultar la documentación de la API de Google aquí .
Este es un ejemplo completo para establecer un marcador en un mapa. Tenga cuidado, debe reemplazar
YOUR_API_KEY
por su clave de API de Google :Ahora, si desea trazar marcadores de una matriz en un mapa, debe hacer lo siguiente:
Este ejemplo me da el siguiente resultado:
También puede agregar una ventana de información en su pin. Solo necesitas este código:
Puede obtener la documentación de Google sobre infoWindows aquí .
Ahora, podemos abrir la ventana de información cuando el marcador es "clik" así:
Tenga en cuenta que puede tener documentación
Listener
aquí en Google Developer.Y, finalmente, podemos trazar una ventana de información en un marcador si el usuario hace clic en ella. Este es mi código completo:
Normalmente, debería tener este resultado:
fuente
Siguiendo la respuesta de Daniel Vassallo , aquí hay una versión que trata el tema del cierre de una manera más simple.
Dado que todos los marcadores tendrán una ventana de información individual y que a JavaScript no le importa si agrega propiedades adicionales a un objeto, ¡todo lo que necesita hacer es agregar una ventana de información a las propiedades del marcador y luego llamar
.open()
a la ventana de información desde sí mismo!Editar: con suficientes datos, la carga de la página puede llevar mucho tiempo, por lo que, en lugar de construir la ventana de información con el marcador, la construcción debería ocurrir solo cuando sea necesario. Tenga en cuenta que cualquier dato utilizado para construir la ventana de información debe agregarse al marcador como una propiedad (
data
). También tenga en cuenta que después del primer evento de clic,infoWindow
persistirá como una propiedad de su marcador para que el navegador no necesite reconstruirse constantemente.fuente
Aquí hay una función de JavaScript de ejemplo casi completa que permitirá múltiples marcadores definidos en un JSONObject.
Solo mostrará los marcadores que están dentro de los límites del mapa.
Esto es importante para que no estés haciendo un trabajo extra.
También puede establecer un límite para los marcadores para que no muestre una cantidad extrema de marcadores (si existe la posibilidad de que haya algo en su uso);
tampoco mostrará marcadores si el centro del mapa no ha cambiado más de 500 metros.
Esto es importante porque si un usuario hace clic en el marcador y arrastra accidentalmente el mapa mientras lo hace, no desea que el mapa vuelva a cargar los marcadores.
Adjunté esta función al detector de eventos inactivo para el mapa, de modo que los marcadores se mostrarán solo cuando el mapa esté inactivo y volverán a mostrar los marcadores después de un evento diferente.
En la captura de pantalla de acción, hay un pequeño cambio en la captura de pantalla que muestra más contenido en la ventana de información. pegado de pastbin.com
fuente
Aquí hay un ejemplo de múltiples marcadores en Reactjs .
A continuación se muestra el componente del mapa.
fuente