usar tutorial que google geolocalizacion como clave android google-maps-android-api-2

tutorial - ¿Cómo convertir un LatLng y un radio a LatLngBounds en Android Google Maps API v2?



google maps documentation (5)

Con la biblioteca javascript puede dibujar un círculo con un centro y un radio y luego obtener sus límites.

centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001); circle = new google.maps.Circle({radius: 5000, center: centerSfo}); bounds = circle.getBounds();

Podrías hacer lo mismo usando la API de Android.

Creo que esto es una limitación de la reciente API de Google Maps v2. Recientemente han agregado la capacidad de dibujar un círculo en el suelo, pero si desea colocar la cámara de modo que muestre todo el círculo, no hay forma de hacerlo.

Uno puede llamar a CameraUpdateFactory # newLatLngBounds (bounds, padding) donde "bounds" es un LatLngBounds y "padding" es una distancia en píxeles. El problema es que no hay forma de crear un LatLng y un radio en LatLngBounds.

El constructor para LatLngBounds solo toma 2 instancias LatLng y genera un rectángulo donde estas son las esquinas NW y SE.


Esto es totalmente factible.

LatLng es el centro de tu círculo, ¿correcto? Lo que quiere hacer es inscribir su círculo dentro de LatLngBounds ( LatLngBounds dentro de un problema de Square), para que todo aparezca en el mapa.

Si dibuja esto en papel, verá que tiene todo lo que necesita para calcular sus LatLngBounds .

¿Recuerdas cómo encontrar las longitudes de los lados de un triángulo rectángulo ?

a² + b² = c²

Si trazas una línea desde el centro de tu círculo hasta la esquina NW (esquina superior izquierda) y otra directamente hacia la pared occidental (línea recta desde el centro, hacia la izquierda) de la casilla, tienes un triángulo. Ahora puede usar la ecuación anterior para resolver c ya que conoce la longitud de los otros lados del triángulo (el radio del círculo).

Entonces ahora tu ecuación se vuelve

r² + r² = c²

que se reduce a

2r² = c²

que además reduce a

c = squareRoot (2) * r

Ahora tienes la distancia. Esto es, por supuesto, una simplificación excesiva, porque la Tierra no es plana. Si las distancias no son enormes, puede usar la misma ecuación anterior, pero modificada para proyectar una tierra esférica en un plano:

http://en.wikipedia.org/wiki/Geographical_distance#Flat-surface_formulae

Observe que esto también usa el teorema de Pitágoras , lo mismo que hicimos anteriormente.

A continuación, tendrá que calcular sus puntos finales (NW, y ES esquinas) desde su punto central dado un rumbo, y la distancia que encontró arriba.

Esta publicación puede ayudar: Calcular la distancia dada por el punto final, el rumbo, el punto de partida

¡No olvides convertir tus grados en radianes cuando uses la ecuación de la publicación enlazada arriba! (Multiplicar grados por pi/180 )



Mientras que respuesta de es correcta si sus LatLngBounds definen un cuadrado, la mayoría de los LatLngBounds definen rectángulos, y como tal, los rumbos de los puntos noreste y sudoeste del centro no siempre serán de 45 y 255 grados.

Por lo tanto, si está buscando obtener LatLngBounds de un radio de un centro para cualquier cuadrilátero, use las coordenadas de sus bounds.northeast iniciales.northeast y bounds.southwest esta manera (usando SphericalUtils):

LatLng northEast = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), SphericalUtil.computeHeading(center, bounds.northeast)); LatLng southWest = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), (180 + (180 + SphericalUtil.computeHeading(center, bounds.southwest))));

(180 + (180 + x)) calcula el rumbo del punto sudoeste desde el centro en el sentido de las agujas del reloj.


Al igual que Risadinha mencionó, puedes lograrlo fácilmente con android-maps-utils . Solo agrega:

compile ''com.google.maps.android:android-maps-utils:0.4.4''

a sus dependencias gradle, use el siguiente código:

public LatLngBounds toBounds(LatLng center, double radiusInMeters) { double distanceFromCenterToCorner = radiusInMeters * Math.sqrt(2.0); LatLng southwestCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 225.0); LatLng northeastCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 45.0); return new LatLngBounds(southwestCorner, northeastCorner); }

EDITAR:

Nuestro objetivo es calcular dos puntos ( LatLngs ): southwestCorner y northeastCorner . Desde javadoc de SphericalUtil , puede leer que 225 y 45 son valores de heading , y la distanceFromCenterToCorner es la distance . Más explicación de los valores en la imagen a continuación: