Pregunta Google Maps Api v3 - getBounds no está definido


Estoy cambiando de v2 a v3 google maps api y tengo un problema con gMap.getBounds() función.

Necesito obtener los límites de mi mapa después de su inicialización.

Aquí está mi código 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());
    }
);

Entonces ahora me alerta que gMap.getBounds() es indefinido.

Intenté obtener los valores getBounds en el evento click y me funciona, pero no puedo obtener los mismos resultados en el evento load map.

También getBounds funciona bien mientras el documento se carga en Google Maps API v2, pero falla en V3.

¿Podría ayudarme a resolver este problema?


76
2018-05-14 07:59


origen


Respuestas:


En los primeros días de la API v3, el getBounds() El método requería que las teselas del mapa terminaran de cargarse para que devolviera los resultados correctos. Sin embargo, ahora parece que puedes escuchar bounds_changed evento, que se dispara incluso antes de la tilesloaded evento:

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



Debería estar funcionando, al menos de acuerdo con la documentación de getBounds (). Sin embargo:

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

Verlo trabajando aquí.


20
2018-05-14 09:27



Estaba diciendo que la solución de Salman es mejor porque el idle evento se llama antes que el tilesloaded uno, ya que espera a que se carguen todas las fichas. Pero en una mirada más cercana, parece bounds_changed se llama incluso antes y también tiene más sentido, ya que estás buscando los límites, ¿verdad? :)

Entonces mi solución sería:

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

14
2017-10-25 00:11



En otros comentarios aquí, se aconseja usar el evento "bounds_changed" sobre "inactivo", con lo que estoy de acuerdo. Ciertamente bajo IE8 que desencadena "inactivo" antes de "bounds_changed" en mi máquina de desarrollo al menos, dejándome con una referencia a null en getBounds.

Sin embargo, el evento "bounds_changed" se activará continuamente cuando arrastres el mapa. Por lo tanto, si desea utilizar este evento para comenzar a cargar marcadores, será pesado en su servidor web.

Mi solución de navegador múltiple a este problema:

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

10
2018-01-11 11:32



Bueno, no estoy seguro de si es demasiado tarde, pero esta es mi solución usando gmaps.js enchufar:

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