Google Maps API v3 – getBounds ist nicht definiert

Lesezeit: 5 Minuten

Benutzer-Avatar
Dolce Vita

Ich wechsle von v2 zu v3 Google Maps API und habe ein Problem mit gMap.getBounds() Funktion.

Ich muss die Grenzen meiner Karte nach ihrer 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());
    }
);

Also das warnt mich jetzt gMap.getBounds() ist nicht definiert.

Ich habe versucht, getBounds-Werte im Click-Ereignis zu erhalten, und es funktioniert gut für mich, aber ich kann nicht die gleichen Ergebnisse im 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önnen Sie mir bitte helfen, dieses Problem zu lösen?

Benutzer-Avatar
Daniel Wassallo

In den frühen Tagen der v3-API war die getBounds() -Methode erforderte, dass die Kartenkacheln vollständig geladen waren, damit sie korrekte Ergebnisse lieferte. Aber jetzt scheint es, dass Sie zuhören können bounds_changed Ereignis, das noch vor dem gefeuert wird 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>

  • Das ist genau das, was ich brauche! danke =). Es hat mein Problem gelöst.

    – Dolce Vita

    4. Juni 2010 um 5:50 Uhr

  • Das ist sehr nützlich für mich, ich habe fast 2 Stunden dafür verschwendet

    – arjuncc

    22. Mai 2012 um 6:36 Uhr

  • Vielen Dank! Es hat mir sehr geholfen

    – Benutzer15

    17. August 2012 um 16:29 Uhr

  • Dies kann auch nützlich sein stackoverflow.com/questions/832692/…

    – dav

    8. Juni 2014 um 4:27 Uhr

  • Für das, was es wert ist, habe ich festgestellt, dass getBounds auf Android-Telefonen nach dem nicht verfügbar ist Erste Aufruf von bounds_changed, aber nach nachfolgenden. Das Ändern in Tilesloaded hat das behoben (obwohl es für einige hässliche Aktualisierungen gesorgt hat).

    – ChrisRae

    4. April 2018 um 22:47 Uhr

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

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 Sie, es funktioniert hier.

  • Dies sollte die akzeptierte Antwort sein. Leerlauf wird viel früher aufgerufen, als warten zu müssen, bis alle Kacheln geladen sind.

    – treznik

    25. Oktober 2010 um 0:05 Uhr

  • @treznik: Wie hast du festgestellt, dass die idle Ereignis wird vor dem ausgelöst tilesloaded Veranstaltung? Für mich die tilesloaded Ereignis feuert ständig vor dem idle Veranstaltung.

    – Daniel Vasallo

    25. Oktober 2010 um 0:18 Uhr


  • das ist genau das wonach ich gesucht habe

    – arjuncc

    22. Mai 2012 um 6:39 Uhr

  • Dies ist die bessere Lösung, wenn Sie die Funktion nur einmal ausführen müssen.

    – bbodenmiller

    27. April 2014 um 6:25 Uhr

Benutzer-Avatar
treznik

Ich sagte, Salmans Lösung ist besser, weil die idle Ereignis wird früher aufgerufen als das tilesloaded one, da es darauf wartet, dass alle Kacheln geladen werden. Aber bei näherer Betrachtung scheint es so bounds_changed heißt schon früher und macht auch mehr sinn, da man ja die grenzen sucht, oder? 🙂

Also meine Lösung wäre:

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

  • Als diese Frage gestellt wurde, bounds_changed hätte nicht funktioniert, da getBounds() erforderlich, dass die Kacheln geladen werden. +1 für den Vorschlag. Ich werde meine Antwort aktualisieren.

    – Daniel Vasallo

    25. Oktober 2010 um 0:22 Uhr

In anderen Kommentaren hier wird empfohlen, das Ereignis “bounds_changed” über “idle” zu verwenden, dem ich zustimme. Sicherlich unter IE8, der zumindest auf meinem Entwicklungscomputer “idle” vor “bounds_changed” auslöst und mir einen Verweis auf null auf getBounds hinterlässt.

Das “bounds_changed”-Ereignis wird jedoch kontinuierlich ausgelöst, wenn Sie die Karte ziehen. Wenn Sie also dieses Ereignis verwenden möchten, um mit dem Laden von Markierungen zu beginnen, wird es Ihren Webserver stark belasten.

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

Nun, ich bin mir nicht sicher, ob ich zu spät bin, aber hier ist meine Lösung 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();

Benutzer-Avatar
jpoehnelt

Hinzufügen einer Antwort für 2021.

Map.getBounds() kann anfangs undefiniert zurückgeben. Die bevorzugte Problemumgehung hierfür ist die Verwendung von bounds_changed Veranstaltung. Typischerweise tritt ein undefinierter Wert nur bei der Initialisierung der Karte auf und nie wieder.

const map = new google.maps.Map(document.getElementById("map"), {
  zoom: 12,
  center: new google.maps.LatLng(55.755327, 37.622166),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

map.addEventListener('bounds_changed', () => {
  console.log(map.getBounds());
});

https://developers.google.com/maps/documentation/javascript/reference/map#Map.bounds_changed

1144160cookie-checkGoogle Maps API v3 – getBounds ist nicht definiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy