Cómo comprobar si el usuario está dentro de un círculo Google Maps v2

Tengo un círculo en mi mapa. Ahora quiero detectar si el usuario (o yo) está dentro del círculo.

Circle circle = map.addCircle(new CircleOptions() .center(new LatLng(14.635594, 121.032962)) .radius(55) .strokeColor(Color.RED) ); 

Tengo este código:

  LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); LocationListener ll = new myLocationListener(); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,ll); Location.distanceBetween( pLat,pLong, circle.getCenter().latitude, circle.getCenter().longitude, distance); if( distance[0] > circle.getRadius() ){ Toast.makeText(getBaseContext(), "Outside", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getBaseContext(), "Inside", Toast.LENGTH_LONG).show(); } 

Y en myLocationListener tengo esto:

 public void onLocationChanged(Location location) { // TODO Auto-generated method stub pLong = location.getLongitude(); pLat = location.getLatitude(); } 

Funciona correctamente si el parámetro dentro de la distanceBetween es entre las coordenadas del marcador, sin embargo, el tostado muestra fuera , aunque mi ubicación está dentro del radio.

Introduzca aquí la descripción de la imagen

¿Alguna idea de cómo hacer esto correctamente? Por favor ayuda. ¡Gracias!

EDITAR

Descubrí algo extraño.

En la imagen, se puede ver que tengo un textView por encima del cual tiene 5 números (círculo de latitud, longitud del círculo, distancia al índice 0, distancia al índice 1, distancia 2 ). distance es una matriz flotante para almacenar la distancia entre el centro del círculo y la ubicación del usuario. Fijé el radio a 100, y pienso que la unidad es metros, sin embargo, como usted puede ver, los valores en el arsenal de la distance son: 1.334880E7 , -81.25308990478516 , -10696092987060547 . ¿Cuál es la fórmula para el cálculo de la distancia? Y también, 1.something veces 10 aumentar a 7 es de unos 13 millones que es realmente mayor que 100. Por favor, ayuda es realmente confuso en este momento. Según la documentación de Circle (El radio del círculo especificado en metros debe ser cero o mayor) y distanceBetween (Calcula la distancia aproximada en metros entre dos lugares) así que no sé por qué es este el resultado.

Introduzca aquí la descripción de la imagen

Tl dr JsFiddle aquí – mira la salida de la consola.

Básicamente hay dos maneras de hacer esto:

  1. Compruebe si el (marcador de) el usuario está dentro de los límites de círculo
  2. Calcular la distancia entre el usuario y el centro del Círculo. A continuación, compruebe si es igual o menor que el radio del círculo. Esta solución necesita la biblioteca spherical para trabajar.

Círculo de límites

Sólo tiene que añadir un círculo:

 circle = new google.maps.Circle( { map : map, center : new google.maps.LatLng( 100, 20 ), radius : 2000, strokeColor : '#FF0099', strokeOpacity : 1, strokeWeight : 2, fillColor : '#009ee0', fillOpacity : 0.2 } ) 

Y luego compruebe si el marcador está dentro:

 circle.getBounds().contains( new google.maps.LatLng( 101, 21 ) ); 

A primera vista podría pensar que esto funciona. Pero no lo hace. En el fondo google (todavía) utiliza un rectángulo, así que todo dentro del rectángulo delimitador, pero fuera del círculo será reconocido como dentro de los límites del latLng. Está mal y es un problema conocido, pero parece que Google no le importa.

Si ahora piensas que funcionaría con límites rectangulares, entonces estás equivocado. Aquellos que no funcionan tampoco.

Distancia esférica

La manera más fácil y mejor es medir la distancia. Incluya la biblioteca esférica añadiendo &library=spherical a su llamada de script de google maps. Entonces ve con

 google.maps.geometry.spherical.computeDistanceBetween( new google.maps.LatLng( 100, 20 ), new google.maps.LatLng( 101, 21 ) ) <= 2000; 

Sé que esta pregunta se había pedido hace más de un año, pero tengo el mismo problema y lo arregló con la función estática de distanceBetween la ubicación.

 float[] distance = new float[2]; Location.distanceBetween(latLng.latitude, latLng.longitude, circle.getCenter().latitude,circle.getCenter().longitude,distance); if ( distance[0] <= circle.getRadius()) { // Inside The Circle } else { // Outside The Circle } 

Utilice GoogleMap.setOnMyLocationChange(OnMyLocationChangeListener) lugar de LocationManager . De esta manera obtendrás la Location s que son iguales que las ubicaciones de puntos azules.

  • java.lang.NullPointerException GoogleMaps V2
  • Los azulejos del mapa parpadean entre el terreno y los tipos normales
  • Problema al eliminar el elemento de clustermanager
  • Manejo de eventos táctiles en SurfaceView sobre Maps API v2
  • Cómo calcular el radio visible en Google Maps en Android
  • Android Google Maps API v2 ruta de visualización
  • Mueva un marcador entre 2 coordenadas siguiendo las instrucciones de manejo
  • Google Map Api v2 muestra "V / GoogleSignatureVerifier: firma no válida" mensaje de error en el registro
  • Extraño error "java.io.IOException: EOF" en Android
  • Marcador de ubicación actual de Google Maps y superposición de radio de precisión
  • (MapView y 1700 elementos de superposición) .equals ("Slow")
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.