2010-05-14 18 views
72

Przechodzę z api google maps v2 do v3 i mam problem z funkcją gMap.getBounds().Google Maps Api v3 - getBounds jest niezdefiniowany

Potrzebuję uzyskać granice mojej mapy po jej inicjalizacji.

Oto mój kod 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()); 
    } 
); 

Więc teraz ostrzega mnie, że gMap.getBounds() jest niezdefiniowany.

Próbowałem uzyskać wartości getBounds w zdarzeniu kliknięcia i działa dobrze dla mnie, ale nie mogę uzyskać takich samych wyników w zdarzeniu mapowania obciążenia.

Również getBounds działa poprawnie podczas ładowania dokumentu w Google Maps API v2, ale nie powiedzie się w wersji V3.

Czy możesz pomóc mi rozwiązać ten problem?

Odpowiedz

118

We wczesnych dniach interfejsu API V3 metoda getBounds() wymagała zakończenia ładowania płytek mapy w celu zwrócenia poprawnych wyników. Jednak teraz wydaje się, że można słuchać bounds_changed wydarzenie, które jest opalane nawet przed zdarzeniem tilesloaded:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
    <title>Google Maps v3 - getBounds is undefined</title> 
    <script src="http://maps.google.com/maps/api/js?sensor=false" 
      type="text/javascript"></script> 
</head> 
<body> 
    <div id="map" style="width: 500px; height: 350px;"></div> 

    <script type="text/javascript"> 
     var map = new google.maps.Map(document.getElementById("map"), { 
     zoom: 12, 
     center: new google.maps.LatLng(55.755327, 37.622166), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     }); 

     google.maps.event.addListener(map, 'bounds_changed', function() { 
     alert(map.getBounds()); 
     }); 
    </script> 
</body> 
</html> 
+1

Dokładnie tego potrzebuję! dzięki =). Rozwiązał mój problem. – DolceVita

+0

dziękuję .... szkoda, że ​​nie zajrzałem tutaj godzinę temu! – kinet

+0

jest to bardzo przydatne dla mnie, prawie zmarnowałem 2 godziny na to – arjuncc

18

To powinno działać, conajmniej według dokumentacji getBounds(). Mimo to:

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()); 
    }); 
}); 

Zobacz działa here.

+0

Dziękuję za ten link, naprawdę dobry system testowy – DolceVita

+0

To powinna być zaakceptowana odpowiedź. Bezczynność jest nazywana wcześniej niż czekanie na załadowanie wszystkich płytek. – treznik

+0

@treznik: Jak ustaliłeś, że zdarzenie "bezczynne" jest uruchamiane przed zdarzeniem 'tilesloaded'? Dla mnie event 'tilesloaded' jest ciągle uruchamiany przed zdarzeniem' idle'. –

14

Mówiłem, że rozwiązanie Salmana jest lepsze, ponieważ zdarzenie idle nazywa się wcześniej niż tilesloaded, ponieważ oczekuje na załadowanie wszystkich płytek. Ale przy bliższym spojrzeniu wygląda na to, że bounds_changed jest wywoływany jeszcze wcześniej i ma więcej sensu, ponieważ szukasz granic, prawda? :)

Więc moje rozwiązaniem byłoby:

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

Gdy to pytanie zostało zadane, 'bounds_changed' nie zadziałałoby, ponieważ' getBounds() 'wymagało załadowania płytek. +1 za sugestię. Zaktualizuję moją odpowiedź. –

9

W innych uwag tutaj, to adviced użyć "bounds_changed" zdarzenie nad "idle", którą się zgadzam. Z pewnością pod IE8, który wyzwala "bezczynność" przed "bounds_changed" przynajmniej na mojej maszynie programistycznej, zostawiając mnie z odwołaniem do null na getBounds.

Zdarzenie "bounds_changed" będzie jednak wyzwalane w sposób ciągły po przeciągnięciu mapy. Dlatego jeśli chcesz użyć tego zdarzenia, aby rozpocząć ładowanie znaczników, będzie to ciężkie na twoim serwerze internetowym.

Moja przeglądarka wielo rozwiązanie tego problemu:

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

Jest to metoda, którą stosuję, z tych samych powodów :-) – oodavid

1

Cóż, nie jestem pewien, czy jestem zbyt późno, ale tutaj jest moje rozwiązanie używając gmaps.js wtyczki:

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(); 
Powiązane problemy