Mi piace creare una mappa con Google Maps in grado di gestire grandi quantità di indicatori (oltre 10.000). Per non rallentare la mappa, ho creato un file XML che emette solo i marker all'interno della finestra corrente.Google Maps V3: mostra solo marcatori nella vista - Cancella problema marcatori
In primo luogo, io uso inizializzazione() per impostare le opzioni della mappa:
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);
});
}
Quando l'evento 'tilesloaded' è finito, io uso loadMapFromCurrentBounds(), questa funzione sarà possibile ottenere i limiti attuali e invia una richiesta al-file XML per mostrare i marcatori che si trovano all'interno della finestra corrente:
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);
}
})
}
Questo sta lavorando molto, tuttavia, il codice corrente non offload marcatori che non sono in de viewport più. Oltre a ciò, carica nuovamente i marker già caricati, che rallenta la mappa molto velocemente quando si spostano la mappa con tempi di visualizzazione nella stessa area.
Quindi, quando la finestra di visualizzazione cambia, mi piace cancellare l'intera mappa prima di caricare nuovi indicatori. Qual è il modo migliore per farlo?
Hey @jeff, thx per le modifiche! Volevo solo farti sapere che puoi effettivamente aggiungere l'evidenziazione della sintassi a * tutte * le risposte su una domanda semplicemente aggiungendo il tag 'JavaScript', usando il link" modifica tag "che appare a destra dei tag. In bocca al lupo! :) – jmort253
Il [Marker Clusterer] (https://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries) potrebbe essere utile quando si ha a che fare con così tanti marcatori. – Blazemonger
puoi salvare poche righe di codice facendo 'map.getBounds(). AUrlValue(). Split (',')' e avrai una bella matrice per i tuoi angoli. – tim