google-maps - herramienta - moz app
Radio de la regiĆ³n "visible" en google maps v3 (4)
Necesito saber cómo recuperar el radio del nivel de zoom visible en google maps API v3.
Por ejemplo, si estoy en el nivel 3 de zoom, y dependiendo del tamaño de la pantalla de los usuarios (digamos 400x400 región visible), ¿cómo obtengo el círculo "radio" del área visible?
Alternativamente, actualmente estoy usando map.fitBounds () para todos los puntos que he agregado al mapa, así que realmente todo lo que NECESITO es el radio de todos los límites. Lo que quiero es algo así como "20 millas" que puedo incluir en mi aplicación de base de datos.
Creo que LatLngBounds tiene los métodos getNorthEast () y getSouthWest (), pero esto le daría un rectángulo (lo que realmente es un límite) y podría calcular la distancia entre esos dos, etc. Para calcular el círculo de esa rectandle podría ser un poco de trabajo ...
Tal vez esto ayude: http://code.google.com/apis/maps/articles/mvcfun.html
y el ejemplo: http://code.google.com/apis/maps/articles/mvcfun/step6.html
El radio sería igual a la distancia desde el centro de los límites a una de las esquinas del límite. Utilizando la fórmula Great Circle Distance de los cálculos de esta página , se me ocurrió lo siguiente:
var bounds = map.getBounds();
var center = bounds.getCenter();
var ne = bounds.getNorthEast();
// r = radius of the earth in statute miles
var r = 3963.0;
// Convert lat or lng from decimal degrees into radians (divide by 57.2958)
var lat1 = center.lat() / 57.2958;
var lon1 = center.lng() / 57.2958;
var lat2 = ne.lat() / 57.2958;
var lon2 = ne.lng() / 57.2958;
// distance = circle radius from center to Northeast corner of bounds
var dis = r * Math.acos(Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));
Después de jugar un poco más con esto, me he dado cuenta de que map.getBounds()
contendrá la vista del mapa completo. Pero si su LatLngBounds
se construye ampliando para incluir puntos LatLng
, y luego emite un map.fitBounds(bounds)
, la API aumenta la ventana del mapa un poco para que los bounds
"caja" tengan algo de relleno.
Si usa la ventana gráfica actual del mapa, el radio desde el centro hasta la esquina de la ventana gráfica puede tener un radio más largo que el que desea. Tal vez la distancia desde el centro de la ventana gráfica hasta el medio del borde más alejado de la ventana gráfica. (Si el mapa no es un cuadrado perfecto)
También rediseñé la respuesta de Eric, la mía es como una función independiente y estoy devolviendo el resultado en metros (según lo necesite la búsqueda de la API de Places) .
function getBoundsRadius(bounds){
// r = radius of the earth in km
var r = 6378.8
// degrees to radians (divide by 57.2958)
var ne_lat = bounds.getNorthEast().lat() / 57.2958
var ne_lng = bounds.getNorthEast().lng() / 57.2958
var c_lat = bounds.getCenter().lat() / 57.2958
var c_lng = bounds.getCenter().lng() / 57.2958
// distance = circle radius from center to Northeast corner of bounds
var r_km = r * Math.acos(
Math.sin(c_lat) * Math.sin(ne_lat) +
Math.cos(c_lat) * Math.cos(ne_lat) * Math.cos(ne_lng - c_lng)
)
return r_km *1000 // radius in meters
}
Versión modificada de la respuesta de Eric anterior utilizando el espacio de nombres google.maps.geometry.spherical (asegúrese de haber cargado la biblioteca de Geometría para que esto funcione).
var bounds = map.getBounds();
var center = map.getCenter();
if (bounds && center) {
var ne = bounds.getNorthEast();
// Calculate radius (in meters).
var radius = google.maps.geometry.spherical.computeDistanceBetween(center, ne);
}