Google Maps Api v3 - getBounds no está definido


83

Estoy cambiando de la api de google maps v2 a v3 y tengo un problema con la 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 advierte que gMap.getBounds()no está definido.

Intenté obtener valores de getBounds en el evento de clic y funciona bien para mí, pero no puedo obtener los mismos resultados en el evento de mapa de carga.

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?

Respuestas:


136

En los primeros días de la API v3, el getBounds()método requería que los mosaicos del mapa hubieran terminado de cargarse para devolver los resultados correctos. Sin embargo, ahora parece que puede escuchar el bounds_changedevento, que se activa incluso antes del tilesloadedevento:

<!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
¡Eso es exactamente lo que necesito! gracias =). Resolvió mi problema.
DolceVita

esto es muy útil para mí, casi desperdicié 2 horas en esto
arjuncc

¡Gracias! Me ayudó mucho
user15

Esto también puede ser útil stackoverflow.com/questions/832692/…
dav

1
Por lo que vale, descubrí que, en los teléfonos Android, getBounds no está disponible después de la primera llamada a limits_changed, sino después de las siguientes. Cambiarlo a mosaicos cargados solucionó eso (aunque hecho para algunas actualizaciones feas).
Chris Rae

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

Véalo funcionando aquí .


Esta debería ser la respuesta aceptada. inactivo se llama mucho antes de tener que esperar a que se carguen todos los mosaicos.
treznik

@treznik: ¿Cómo determinó que el idleevento se dispara antes del tilesloadedevento? Para mí, el tilesloadedevento se dispara constantemente antes del idleevento.
Daniel Vassallo

esto es exactamente lo que estaba buscando
arjuncc

Esta es la mejor solución si solo necesita que la función se ejecute una vez.
bbodenmiller

15

Decía que la solución de Salman es mejor porque el idleevento se llama antes que el anterior tilesloaded, ya que espera a que se carguen todos los mosaicos. Pero en una mirada más cercana, parece que bounds_changedse 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());
});

1
Cuando se hizo esta pregunta, bounds_changedno habría funcionado, ya que getBounds()requería que se cargaran los mosaicos. +1 por sugerirlo. Actualizaré mi respuesta.
Daniel Vassallo

11

En otros comentarios aquí, se recomienda usar el evento "limits_changed" en lugar de "idle", con lo que estoy de acuerdo. Ciertamente, bajo IE8 que activa "inactivo" antes de "límites_cambiados" en mi máquina de desarrollo al menos, dejándome con una referencia a nulo en getBounds.

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

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

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

1
Este es el método que empleo, por las mismas razones :-)
oodavid

1

Bueno, no estoy seguro si llegué demasiado tarde, pero aquí está mi solución usando el complemento 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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.