Me gusta crear un mapa con Google Maps que pueda manejar grandes cantidades de marcadores (más de 10.000). Para no ralentizar el mapa, he creado un archivo XML que solo muestra los marcadores que están dentro de la ventana gráfica actual.Google Maps V3: Mostrar solo marcadores en la ventana gráfica - Borrar el número de marcadores
En primer lugar, yo uso inicializar() para configurar las opciones del mapa:
function initialize() {
var myLatlng = new google.maps.LatLng(51.25503952021694,3.27392578125);
var myOptions = {
zoom: 8,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
google.maps.event.addListener(map, 'tilesloaded', function() {
loadMapFromCurrentBounds(map);
});
}
Cuando se termina el evento 'tilesloaded', utilizo loadMapFromCurrentBounds(), esta función obtendrán los límites actuales y envía una solicitud al archivo XML para mostrar los marcadores que están dentro de la ventana gráfica actual:
function loadMapFromCurrentBounds(map) {
// First, determine the map bounds
var bounds = map.getBounds();
// Then the points
var swPoint = bounds.getSouthWest();
var nePoint = bounds.getNorthEast();
// Now, each individual coordinate
var swLat = swPoint.lat();
var swLng = swPoint.lng();
var neLat = nePoint.lat();
var neLng = nePoint.lng();
downloadUrl("mapsxml.php?swLat="+swLat+"&swLng="+swLng+"&neLat="+neLat+"&neLng="+neLng+"", function(data) {
var xml = parseXml(data);
var markers = xml.documentElement.getElementsByTagName("marker");
var infoWindow = new google.maps.InfoWindow;
for (var i = 0; i < markers.length; i++) {
var address = markers[i].getAttribute("address");
var type = markers[i].getAttribute("type");
var name = markers[i].getAttribute("name");
var point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng"))
);
var html = "<b>" + name + "</b> <br/>" + address;
var icon = customIcons[type] || {};
var marker = new google.maps.Marker({
map: map,
position: point,
icon: icon.icon,
shadow: icon.shadow});
bindInfoWindow(marker, map, infoWindow, html);
}
})
}
Esto es trabajo grande, sin embargo, el código actual no descarga de marcadores que no están en la ventana gráfica de más. Además de eso, vuelve a cargar marcadores que ya están cargados, lo que ralentiza el mapa realmente rápido al mover el mapa una vista veces en la misma área.
Así que cuando la ventana gráfica cambia, me gusta borrar todo el mapa primero antes de cargar nuevos marcadores. ¿Cuál es la mejor manera de hacer esto?
Hey @ Jeff, thx por las ediciones! Solo quería que supieras que puedes agregar realce de sintaxis a * todas * las respuestas a una pregunta simplemente agregando la etiqueta 'JavaScript', usando el enlace" editar etiquetas "que aparece a la derecha de las etiquetas. ¡Buena suerte! :) – jmort253
El [Marcador Clusterer] (https://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries) podría ser útil cuando se trata de tantos marcadores. – Blazemonger
puede guardar unas líneas de código arriba haciendo 'map.getBounds(). ToUrlValue(). Split (',')' y tiene una buena matriz para sus esquinas. – tim