84 votes

Google Maps Api v3 - getBounds n'est pas défini

Je suis passer de la v2 à la v3 de l'api google maps et eu un problème avec gMap.getBounds() fonction.

J'ai besoin d'obtenir les limites de ma carte après son initialisation.

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

Alors maintenant, il me prévient que gMap.getBounds() n'est pas défini.

J'ai essayé de m'getBounds valeurs dans l'événement click et il fonctionne très bien pour moi, mais je ne peux pas obtenir les mêmes résultats en charge des évènements de la carte.

Aussi getBounds fonctionne très bien si le document est en cours de chargement dans Google Maps API v2, mais il échoue dans V3.

Pourriez-vous svp m'aider à résoudre ce problème?

139voto

Daniel Vassallo Points 142049

Aux débuts de l'API v3, la méthode getBounds() exigeait que le chargement des mosaïques de carte soit terminé pour pouvoir renvoyer des résultats corrects. Cependant, il semble maintenant que vous puissiez écouter l'événement bounds_changed , qui est déclenché avant même l'événement 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>
 

21voto

Salman A Points 60620

Cela devrait fonctionner, du moins selon la documentation de getBounds (). Néanmoins:

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

Voyez-le travailler ici .

15voto

treznik Points 2514

Je disais que la solution de Salman est meilleure parce que l'événement idle est appelé avant l'événement tilesloaded one, car il attend que toutes les tuiles soient chargées. Mais à y regarder de plus près, il semble que bounds_changed est appelé encore plus tôt et cela a aussi plus de sens, puisque vous recherchez les limites, n'est-ce pas? :)

Donc ma solution serait:

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

11voto

Almer Points 121

Dans d'autres commentaires ici, il est conseillé d'utiliser le "bounds_changed" événement sur "inactif", je suis d'accord avec. Certainement sous IE8 qui déclenche le "ralenti" avant "bounds_changed" sur ma machine de dev au moins, me laissant avec une référence à null dans getBounds.

Le "bounds_changed" de l'événement, cependant, sera déclenchée en permanence lorsque vous faites glisser la carte. En effet, si vous souhaitez utiliser cet événement pour lancer le chargement des marqueurs, il sera lourd sur votre serveur.

Mon multi navigateur solution à ce problème:

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

1voto

Fernando Points 2927

Eh bien, je ne sais pas si je suis trop tard, mais voici ma solution en utilisant le plugin gmaps.js :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X