Tengo un conjunto de puntos que quiero trazar en un mapa de Google incrustado (API v3). Me gustaría que los límites acomoden todos los puntos a menos que el nivel de zoom sea demasiado bajo (es decir, se haya alejado demasiado). Mi enfoque ha sido así:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Esto no funciona La última línea "gmap.setZoom ()" no cambia el nivel de zoom del mapa si se llama directamente después de fitBounds.
¿Hay alguna manera de obtener el nivel de zoom de un límite sin aplicarlo al mapa? ¿Otras ideas para resolver esto?
Respuestas:
Editar : Vea el comentario de Matt Diamond a continuación.
¡Entendido! Prueba esto:
Modifique a sus necesidades.
fuente
Resolví un problema similar en una de mis aplicaciones. Estaba un poco confundido por tu descripción del problema, pero creo que tienes el mismo objetivo que yo tenía ...
En mi aplicación, quería trazar uno o más marcadores y asegurarme de que el mapa los mostrara a todos. El problema era que si confiaba únicamente en el método fitBounds, el nivel de zoom se maximizaría cuando hubiera un solo punto; eso no era bueno.
La solución fue usar fitBounds cuando había muchos puntos, y setCenter + setZoom cuando solo había un punto.
fuente
He visitado esta página varias veces para obtener la respuesta, y aunque todas las respuestas existentes fueron muy útiles, no resolvieron mi problema exactamente.
Básicamente descubrí que el evento 'zoom_changed' evitó que la interfaz de usuario del mapa se "saltara", lo que sucedió cuando esperé el evento 'inactivo'.
Espero que esto ayude a alguien!
fuente
fitBounds()
si se utilizazoom_changed
bounds_changed
, porquezoom_changed
no tiene que activarse en el caso cuando sefitBounds
mantiene el nivel de zoom. Mi intento jsfiddle.net/rHeMp/10 no lo confirma, pero no se debe confiar en un comportamiento indefinido.Acabo de arreglar esto configurando maxZoom por adelantado y luego eliminándolo. Por ejemplo:
fuente
Si no me equivoco, supongo que desea que todos sus puntos sean visibles en el mapa con el nivel de zoom más alto posible. Logré esto inicializando el nivel de zoom del mapa a 16 (no estoy seguro si es el nivel de zoom más alto posible en V3).
Luego, después de eso, hice los límites:
Resultado: ¡Éxito!
fuente
Yo suelo:
Esto usará el menor de 24 y el nivel de zoom necesario de acuerdo con su código, sin embargo, probablemente cambia el zoom de todos modos y no le importa cuánto haya alejado.
fuente
Por favor intente esto:
fuente
Tuve el mismo problema y pude resolverlo usando el siguiente código. Este
google.maps.addListenerOnce()
evento listener ( ) solo se activará una vez, justo después de quemap.fitBounds()
se ejecute. Entonces, no hay necesidad deidle
.Establece el nivel de zoom apropiado inicialmente y permite al usuario acercar y alejar más allá del nivel de zoom inicial porque el detector de eventos ha expirado. Por ejemplo, si solo
google.maps.addListener()
se llamó, entonces el usuario nunca podrá hacer zoom más allá del nivel de zoom establecido (en el caso, 4). Desde que implementamosgoogle.maps.addListenerOnce()
, el usuario podrá hacer zoom a cualquier nivel que elija.fuente
Tenía el mismo problema, necesitaba colocar muchos marcadores en el mapa. Esto resolvió mi caso:
bounds.extend(objLatLng)
)Ejecutar fitbounds DESPUÉS de completar el mapa:
fuente
He encontrado una solución que hace la comprobación antes de llamar
fitBounds
para que no se acerque y se aleje repentinamenteTendrás que jugar un poco con la variable minLatSpan para llegar a donde quieras. Varía según el nivel de zoom y las dimensiones del lienzo del mapa.
También puedes usar longitud en lugar de latitud
fuente
Vi muchas soluciones incorrectas o demasiado complicadas, así que decidí publicar una solución elegante y funcional .
La razón por la
setZoom()
que no funciona como espera es quefitBounds()
es asincrónica, por lo que no garantiza que actualizará el zoom de inmediato, pero su llamado asetZoom()
confiar en eso.Lo que puede considerar es configurar la
minZoom
opción de mapa antes de llamarfitBounds()
y luego borrarla después de que se complete (para que los usuarios puedan alejarse manualmente si lo desean):Además, si desea limitar también el zoom máximo, puede aplicar el mismo truco con el
maxZoom
propiedad.Vea los documentos de MapOptions .
fuente
Lo uso para asegurarme de que el nivel de zoom no exceda un nivel establecido, de modo que sé que las imágenes satelitales estarán disponibles.
Agregue un oyente al
zoom_changed
evento. Esto tiene la ventaja adicional de controlar el control de zoom en la interfaz de usuario también.Sólo ejecutar
setZoom
si es necesario, por lo que unaif
afirmación es preferibleMath.max
oaMath.min
Para evitar alejarse demasiado:
fuente
En esta función, debe agregar dinámicamente metadatos para almacenar el tipo de geometría solo porque la función acepta cualquier geometría.
"fitGeometries" es una función JSON que extiende un objeto de mapa.
"geometrías" es una matriz genérica de JavaScript, no un MVCArray ().
fuente
este trabajo es para mí con API v3 pero con configuración de zoom fijo:
fuente
Como yo, si no está dispuesto a jugar con los oyentes, esta es una solución simple que se me ocurrió: agregue un método en el mapa que funcione estrictamente de acuerdo con sus requisitos como este:
entonces puede llamar en
map.fitLmtdBounds(bounds)
lugar demap.fitBounds(bounds)
establecer los límites bajo el rango de zoom definido ... omap.fitLmtdBounds(bounds,3,5)
anular el rango de zoom ...fuente
Por favor intente esto.
Si esto te será útil.
Todo lo mejor
fuente
Después del cálculo de los límites, puede verificar la distancia entre la esquina superior izquierda y la esquina inferior derecha; entonces puede comprender el nivel de zoom probando la distancia (si la distancia es demasiado alta, el nivel de zoom sería bajo), entonces puede seleccionar el tiempo usando el método setbound o setZoom.
fuente
No me gusta sugerirlo, pero si debe intentarlo, primero llame
gmap.fitBounds(bounds);
Luego cree un nuevo Thread / AsyncTask, hágalo dormir durante 20-50 ms aproximadamente y luego llame
gmap.setZoom( Math.max(6, gmap.getZoom()) );
desde el hilo de la interfaz de usuario (use un controlador o el
onPostExecute
método para AsyncTask).No sé si funciona, solo una sugerencia. Aparte de eso, tendría que calcular de alguna manera el nivel de zoom a partir de sus puntos, verificar si es demasiado bajo, corregirlo y luego simplemente llamar
gmap.setZoom(correctedZoom)
fuente
Si 'limits_changed' no está disparando correctamente (a veces Google no parece aceptar las coordenadas perfectamente), entonces considere usar 'center_changed' en su lugar.
El evento 'center_changed' se activa cada vez que se llama a fitBounds (), aunque se ejecuta inmediatamente y no necesariamente después de que el mapa se haya movido.
En casos normales, 'inactivo' sigue siendo el mejor oyente de eventos, pero esto puede ayudar a un par de personas a encontrarse con problemas extraños con sus llamadas fitBounds ().
Ver devolución de llamada de Google Maps fitBounds
fuente
Para intervenir con otra solución, descubrí que el enfoque "escuchar eventos limit_changed y luego establecer nuevo zoom" no funcionó de manera confiable para mí. Creo que a veces estaba llamando
fitBounds
antes de que el mapa se hubiera inicializado por completo, y la inicialización estaba causando un evento confitBounds
límites cambiados que agotaría al oyente, antes de cambiar los límites y el nivel de zoom. Terminé con este código, que parece funcionar hasta ahora:fuente
Para mí, la solución más fácil fue esta:
fuente
fuente
Todo lo que hice es:
Y funciona en la API V3.
fuente