plataforma moz herramienta app google-maps google-maps-api-3

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.



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