2012-06-19 9 views
8

Ho un mazzo o marcatori e voglio mostrare solo l'area che li contiene. Ho trovato una lunga lista di domande simili (vedi in fondo per alcuni), ma nessuna delle soluzioni funziona per me. Il LatLngBounds è compilato correttamente, ma quando chiamo fitBounds il risultato sarà il seguente: after calling fitBounds() Invece di: what should be Qualcuno può individuare un errore evidente nel mio codice?fitBounds() mostra l'intera terra (se la mappa viene prima nascosta e quindi visualizzata)

var opt = { 
    zoom: 8, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 
map = new google.maps.Map(document.getElementById("map"),opt); 
var box = new google.maps.LatLngBounds(); 
for(var i=0;i<list.length;i++){ 
    var p = new google.maps.LatLng(list[i].lat,list[i].lon); 
    var marker = new google.maps.Marker({ 
     position: p, 
     map: map 
    }); 
    box.extend(p); 
} 
map.fitBounds(box); 
map.panToBounds(box); 

Alcuni dei posti che ho letto e provato (elenco non completo):


Modifica: questo accade in realtà se (come faccio nella mia applicazione) la mappa è inizialmente nascosta e mostrata solo più tardi. mi nascondo in questo modo:

$('#map').hide();

e mostrarlo:

$('#map').show(function(){ 
    //this is necessary because otherwise 
    //the map will show up in the upper left corner 
    //until a window resize takes place 
    google.maps.event.trigger(map, 'resize'); 
}); 

Qualsiasi indizio sul perché questo accade e come evitare che (a parte l'inizializzazione la mappa quando indicato prima) ?

Nota a margine, se si imposta lo zoom e il centro quando si dichiara l'oggetto della mappa (ad esempio, io non uso fitBounds()), la mappa verrà visualizzata correttamente, anche dopo un nascondimento/mostra. Non riesco a impostare lo zoom e il centro, perché l'elenco dei punti viene recuperato altrove e non so dove sono in anticipo.

+0

Probabilmente, alcuni dei tuoi elementi di 'lista [i]' sono 'non validi'. Prova a eseguire il debug, e vedi, tutti gli elementi 'list [i]' hanno proprietà 'lat', 'lon', e quelli non sono 'null',' indefinito', 'NaN', ecc. – Engineer

+0

@Engineer ringrazia per il commento, ma gli elementi sono tutti buoni. Come nota a margine, ciò accade con Firefox 13, Chrome 19 e IE 9. – Stephan

+0

Fornire l'elenco su cui si sta iterando. Renderà molto più facile il debug. – puckhead

risposta

13

Risolto (non in un modo carino, però). Quello che ho finito di fare è stato inizializzare lo LatLngBounds con i punti durante il caricamento della pagina, ma la panoramica e lo zoom solo quando si mostra la mappa. In questo modo funziona correttamente. E.g.

var box; 
function init(){ 
    var opt = { 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById("map"),opt); 
    box = new google.maps.LatLngBounds(); 
    for(var i=0;i<list.length;i++){ 
     var p = new google.maps.LatLng(list[i].lat,list[i].lon); 
     var marker = new google.maps.Marker({ 
      position: p, 
      map: map 
     }); 
     box.extend(p); 
    } 
} 

e poi, più tardi (cliccare su un pulsante per esempio)

function showMap(){ 
    $('#map').show(function(){ 
    google.maps.event.trigger(map, 'resize'); 
    map.fitBounds(box); 
    map.panToBounds(box); 
    }); 
} 

Funziona, ma non mi piace avere che var globale in giro. Implemento lo stesso identico comportamento usando OpenLayers e funziona correttamente senza la necessità di questo hack. Se qualcuno ha una soluzione migliore, si prega di postarlo e lo accetterò se funziona.

Grazie a @Engineer e @Matt Handy per avermi aiutato a eliminare una possibile fonte di errori.

+0

Quasi un anno dopo e ho colpito lo stesso problema! Sembra che la chiamata ' fitBounds() 'su una mappa nascosta e successivamente innescando l'evento' resize' causa il problema.La tua soluzione funziona come previsto se chiamo 'fitBounds()' ** dopo ** innescando l'evento quando la mappa è visibile.Acclamati! –

+0

La tua descrizione del problema si adattava a un problema simile che avevo, e anche la soluzione. Grazie per averlo bloccato! – thomax

+0

Questo problema era quasi identico a qualcosa rilevato utilizzando le schede di bootstrap quando lo stato dell'interfaccia utente non era visibile per impostazione predefinita. un champ quando estendi i confini su una mappa da uno stato nascosto. – Jakkwylde

0

Modifica per le vostre esigenze

map.fitBounds(bounds); 

var listener = google.maps.event.addListener(map, "idle", function() { 
    if (map.getZoom() > 16) map.setZoom(16); 
    google.maps.event.removeListener(listener); 
}); 
+0

provato anche questo, lo stesso risultato – Stephan

1

ho provato il codice in un fiddle, e funziona come previsto.

Quindi il motivo per cui il codice non funziona deve essere nella definizione dei punti dati (come già suggerito dall'Ingegnere). Confronta la tua definizione di elenco con la mia e controlla se sono diversi.

+1

Ho provato il tuo violino con i miei dati, e funziona. :(Questo deve significare che l'errore si trova da qualche altra parte nel codice. Proverò a spogliarlo al minimo e vedere dove inizia a lavorare – Stephan