J'aime créer une carte avec Google Maps qui peut gérer de grandes quantités de marqueurs (plus de 10.000). Pour ne pas ralentir la carte, j'ai créé un fichier XML qui affiche uniquement les marqueurs qui se trouvent dans la fenêtre courante.Google Maps V3: Afficher uniquement les marqueurs dans viewport - Effacer les marqueurs
D'abord, j'utilise initialiser() pour configurer les options de carte:
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);
});
}
Lorsque l'événement « tilesloaded » est terminé, j'utilise loadMapFromCurrentBounds(), cette fonctions sera les limites actuelles et envoie une demande le fichier XML pour montrer les marqueurs qui sont dans la fenêtre courante:
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);
}
})
}
Cela fonctionne très bien, cependant, le code actuel n'Offload pas les marqueurs qui ne sont pas de plus viewport. En plus de cela, il charge à nouveau des marqueurs qui sont déjà chargés, ce qui ralentit la carte très rapidement en déplaçant la carte une fois dans la même zone.
Ainsi, lorsque la fenêtre d'affichage change, j'aime effacer toute la carte avant de charger de nouveaux marqueurs. Quelle est la meilleure façon de procéder?
Hey @ Jeff, thx pour les modifications! Je voulais juste que vous sachiez que vous pouvez ajouter de la syntaxe en surlignant * toutes * les réponses à une question en ajoutant simplement la balise «JavaScript», en utilisant le lien «modifier les balises» qui apparaît à droite des balises. Bonne chance! :) – jmort253
Le [Marker Clusterer] (https://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries) peut s'avérer utile pour gérer autant de marqueurs. – Blazemonger
vous pouvez enregistrer quelques lignes de code ci-dessus en faisant 'map.getBounds(). ToUrlValue(). Split (',')' et avoir un bon tableau pour vos coins. – tim