2010-05-14 46 views
72

Ich bin von v2 auf v3 Google Maps API gewechselt und habe ein Problem mit gMap.getBounds() Funktion.Google Maps Api v3 - getBounds ist undefined

Ich brauche die Grenzen meiner Karte nach seiner Initialisierung zu bekommen.

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

So jetzt ist es mir warnt, dass gMap.getBounds() nicht definiert ist.

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

Auch getBounds funktioniert einwandfrei, 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?

Antwort

118

In den frühen Tagen der v3-API erforderte die Methode getBounds(), dass die Kartenkacheln vollständig geladen wurden, damit die richtigen Ergebnisse zurückgegeben wurden. Aber jetzt scheint es, dass Sie bounds_changed Ereignis hören, die schon vor dem tilesloaded Ereignis ausgelöst wird:

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

Genau das brauche ich! Danke =). Es hat mein Problem gelöst. – DolceVita

+0

danke .... ich wünschte, ich hätte vor einer Stunde hier gesucht! – kinet

+0

das ist sehr nützlich für mich, ich habe fast 2 Stunden dafür verschwendet – arjuncc

18

Es sollte arbeiten, atleast entsprechend 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 Sie es funktioniert here.

+0

Vielen Dank für diesen Link, wirklich gutes Testsystem – DolceVita

+0

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

+0

@treznik: Wie haben Sie festgestellt, dass das 'idle' Event vor dem' tilesloaded' Ereignis ausgelöst wird? Bei mir wird das Ereignis "tilesloaded" ständig vor dem Ereignis "idle" ausgelöst. –

14

Ich sagte Salmans Lösung ist besser, weil das idle Ereignis früher als das tilesloaded aufgerufen wird, da es darauf wartet, dass alle Kacheln geladen werden. Aber bei näherem Hinsehen scheint es bounds_changed noch früher genannt zu werden und es macht auch mehr Sinn, da man nach den Grenzen sucht, oder? :)

So wäre meine Lösung sein:

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

Wenn diese Frage gestellt wurde, hätte 'bounds_changed' nicht funktioniert, da' getBounds() 'das Laden der Kacheln erforderte. +1 für das Vorschlagen. Ich werde meine Antwort aktualisieren. –

9

In anderen Kommentaren hier, ist es ratsam, das „bounds_changed“ Veranstaltung über „Leerlauf“ zu verwenden, die ich mit einigen. Sicherlich unter IE8, was zumindest "unlimited" vor "bounds_changed" auf meiner Dev-Maschine auslöst und mich mit einem Verweis auf null auf getBounds belässt.

Das Ereignis "bounds_changed" wird jedoch kontinuierlich ausgelöst, wenn Sie die Karte ziehen. Wenn Sie also dieses Ereignis verwenden möchten, um mit dem Laden von Markern zu beginnen, wird es auf Ihrem Webserver schwer werden.

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

Dies ist die Methode, die ich aus den gleichen Gründen verwende :-) – oodavid

1

Nun, ich bin 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();