Pytanie Google Maps Api v3 - getBounds jest niezdefiniowany


Przechodzę z api mapy google v2 na v3 i mam problem z gMap.getBounds() funkcjonować.

Muszę 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 to ostrzega gMap.getBounds() jest niezdefiniowany.

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

Również getBounds działa poprawnie podczas wczytywania dokumentu w Google Maps API v2, ale kończy się niepowodzeniem w V3.

Czy mógłbyś mi pomóc rozwiązać ten problem?


76
2018-05-14 07:59


pochodzenie




Odpowiedzi:


We wczesnych dniach v3 API, getBounds() Metoda wymagała, aby kafelki mapy zakończyły się ładowaniem, aby zwrócić poprawne wyniki. Jednak teraz wydaje się, że można słuchać bounds_changed wydarzenie, które jest zwalniane nawet przed tilesloaded zdarzenie:

<!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>

122
2018-05-14 09:20



Właśnie tego potrzebuję! dzięki =). Rozwiązał mój problem. - DolceVita
dziękuję .... chciałbym, żeby wyglądałem tu godzinę temu! - kinet
jest to dla mnie bardzo przydatne, prawie na to straciłem 2 godziny - arjuncc
Dziękuję Ci! Bardzo mi to pomogło - user15
Perfekcyjnie, dzięki ! - maiis


Powinien działać co najmniej zgodnie z dokumentacją getBounds (). Niemniej jednak:

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, jak działa tutaj.


20
2018-05-14 09:27



Dziękuję za ten link, naprawdę dobry system testowy - DolceVita
To powinna być zaakceptowana odpowiedź. Bezczynność jest nazywana wcześniej niż czekanie na załadowanie wszystkich płytek. - treznik
@treznik: Jak ustaliłeś, że idle wydarzenie zostaje zwolnione przed tilesloaded zdarzenie? Dla mnie tilesloaded impreza nieustannie wystrzeliwuje przed idle zdarzenie. - Daniel Vassallo
właśnie tego szukałem - arjuncc
To jest lepsze rozwiązanie, jeśli potrzebujesz tylko jednej funkcji do uruchomienia. - bbodenmiller


Mówiłem, że rozwiązanie Salmana jest lepsze, ponieważ idle zdarzenie jest wywoływane wcześniej niż tilesloaded jeden, ponieważ czeka na załadowanie wszystkich płytek. Wygląda jednak na bliżej bounds_changed nazywa się jeszcze wcześniej i ma również więcej sensu, ponieważ szukasz granic, prawda? :)

Więc moje rozwiązanie byłoby:

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

14
2017-10-25 00:11



Kiedy to pytanie zostało zadane, bounds_changed nie działałby, jak getBounds() wymagało załadowania płytek. +1 za sugestię. Zaktualizuję moją odpowiedź. - Daniel Vassallo


W innych komentarzach zaleca się użycie zdarzenia "bounds_changed" zamiast "idle", z czym 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 uruchamiane w sposób ciągły, gdy przeciągniesz mapę. Dlatego jeśli chcesz użyć tego zdarzenia, aby rozpocząć ładowanie znaczników, będzie to ciężkie na twoim serwerze internetowym.

Moje rozwiązanie dla wielu przeglądarek tego problemu:

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

10
2018-01-11 11:32



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


Cóż, nie jestem pewien, czy jestem spóźniony, ale tutaj jest moje rozwiązanie gmaps.js podłącz:

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

1
2017-10-22 19:19