Google Maps Api v3 – getBounds non è definito

Sto passando da v2 a v3 google maps api e ho un problema con la funzione gMap.getBounds() .

Ho bisogno di ottenere i limiti della mia mappa dopo la sua inizializzazione.

Ecco il mio codice javascript:

 var gMap; $(document).ready( function() { var latlng = new google.maps.LatLng(55.755327, 37.622166); var myOptions = { zoom: 12, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); alert(gMap.getBounds()); } ); 

Così ora mi avvisa che gMap.getBounds() non è definito.

Ho provato a ottenere i valori getBounds nell’evento click e funziona correttamente, ma non riesco a ottenere gli stessi risultati nell’evento load map.

Anche getBounds funziona bene mentre il documento si sta caricando nell’API di Google Maps v2, ma fallisce in V3.

Potresti per favore aiutarmi a risolvere questo problema?

Nei primi giorni dell’API v3, il metodo getBounds() richiedeva il completamento del caricamento dei getBounds() della mappa affinché restituisse risultati corretti. Tuttavia ora sembra che tu possa ascoltare l’evento bounds_changed , che viene tilesloaded anche prima dell’evento tilesloaded :

     Google Maps v3 - getBounds is undefined    

Dovrebbe funzionare, almeno secondo la documentazione di getBounds (). Tuttavia:

 var gMap; $(document).ready(function() { var latlng = new google.maps.LatLng(55.755327, 37.622166); var myOptions = { zoom: 12, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); google.maps.event.addListenerOnce(gMap, 'idle', function(){ alert(this.getBounds()); }); }); 

Guardalo lavorando qui .

Stavo dicendo che la soluzione di Salman è migliore perché l’evento idle viene chiamato prima di quello tilesloaded , dal momento che aspetta che tutte le tessere vengano caricate. Ma a ben guardare, sembra che bounds_changed sia chiamato anche prima e ha anche più senso, visto che stai cercando i limiti, giusto? 🙂

Quindi la mia soluzione sarebbe:

 google.maps.event.addListenerOnce(gMap, 'bounds_changed', function(){ alert(this.getBounds()); }); 

In altri commenti qui, si consiglia di utilizzare l’evento “bounds_changed” su “idle”, che sono d’accordo. Certamente con IE8 che innesca “idle” prima di “bounds_changed” sulla mia macchina di sviluppo, lasciandomi con un riferimento a null su getBounds.

Tuttavia, l’evento “bounds_changed” verrà triggersto continuamente quando trascinerai la mappa. Pertanto, se si desidera utilizzare questo evento per iniziare a caricare i marcatori, sarà pesante sul proprio server web.

La mia soluzione multi browser per questo problema:

 google.maps.event.addListenerOnce(gmap, "bounds_changed", function(){ loadMyMarkers(); google.maps.event.addListener(gmap, "idle", loadMyMarkers); }); 

Beh, non sono sicuro se sono in ritardo, ma ecco la mia soluzione usando il plugin gmaps.js :

 map = new GMaps({...}); // bounds loaded? if not try again after 0.5 sec var check_bounds = function(){ var ok = true; if (map.getBounds() === undefined) ok = false; if (! ok) setTimeout(check_bounds, 500); else { //ok to query bounds here var bounds = map.getBounds(); } } //call it check_bounds();