84 Stimmen

Google Maps Api v3 - getBounds ist undefiniert

Ich wechsle gerade von v2 zu v3 google maps api und habe ein Problem mit gMap.getBounds() Funktion.

Ich muss die Grenzen meiner Karte nach der Initialisierung abrufen.

Hier ist mein Javascript-Code:

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

Jetzt wird mir also mitgeteilt, dass gMap.getBounds() ist undefiniert.

Ich habe versucht, getBounds Werte in Klick-Ereignis und es funktioniert gut für mich, aber ich kann nicht die gleichen Ergebnisse in Load Map-Ereignis erhalten.

Auch getBounds funktioniert gut, während das Dokument in Google Maps API v2 geladen wird, aber es schlägt in V3 fehl.

Könnten Sie mir bitte helfen, dieses Problem zu lösen?

139voto

Daniel Vassallo Punkte 325264

In den frühen Tagen der v3-API wurde die getBounds() Methode erforderte, dass die Kartenkacheln fertig geladen waren, damit sie korrekte Ergebnisse lieferte. Jetzt scheint es jedoch so zu sein, dass man auf bounds_changed Ereignis, das noch vor dem Ereignis tilesloaded Veranstaltung:

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

21voto

Salman A Punkte 246207

Es sollte funktionieren, zumindest laut der Dokumentation für getBounds(). Trotzdem:

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

Sehen, wie es funktioniert hier .

15voto

treznik Punkte 7725

Ich habe gesagt, dass Salmans Lösung besser ist, weil die idle Ereignis früher aufgerufen wird als das tilesloaded eine, da sie wartet, bis alle Kacheln geladen sind. Aber bei näherer Betrachtung scheint es bounds_changed wird sogar noch früher aufgerufen und macht auch mehr Sinn, da man nach den Grenzen sucht, richtig? :)

Meine Lösung wäre also:

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

11voto

Almer Punkte 969

In anderen Kommentaren hier wird empfohlen, das Ereignis "bounds_changed" statt "idle" zu verwenden, womit ich einverstanden bin. Sicherlich unter IE8, die "idle" vor "bounds_changed" auf meine Dev-Maschine zumindest auslöst, so dass ich mit einem Verweis auf null auf getBounds.

Das Ereignis "bounds_changed" wird jedoch kontinuierlich ausgelöst, wenn Sie die Karte ziehen. Wenn Sie also dieses Ereignis zum Laden von Markern verwenden möchten, wird Ihr Webserver stark belastet.

Meine Multi-Browser-Lösung für dieses Problem:

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

1voto

Fernando Punkte 7645

Nun, ich bin nicht sicher, ob ich zu spät bin, aber hier ist meine Lösung mit gmaps.js Plugin:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X