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:
- Android maps: No se pudo encontrar el estilo 'mapViewStyle' en el tema actual
- Error de compilación en Android Studio Al realizar un simple proyecto Google API de Google Maps API v2
- Android Google Maps: Combine scrollBy con zoomBy para pan y zoom simultáneos
- MapView onCreate lanza NullPointerException en dispositivos LG
- Android Google Maps V2 - Tarjeta Sd como proveedor de mosaico
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.
¿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.
- Actividad muestra pantalla en blanco en lugar de mapa
- ¿Funciona el reconocimiento de actividad de Google en las versiones anteriores de Android?
- ROTATE Google-Map para mostrar mi DIRECCIÓN en tiempo real
- ¿Cómo puedo crear una aplicación de Android en Android Studio que usa Google Maps Api v2?
- LocationClient no conectado en el método "onConnected"
- Configuración de un LongClickListener en un marcador de mapa
- Google Maps CameraUpdateFactory no se ha inicializado
- ¿Asir la ubicación del usuario con google maps v2 en android?
Tl dr JsFiddle aquí – mira la salida de la consola.
Básicamente hay dos maneras de hacer esto:
- Compruebe si el (marcador de) el usuario está dentro de los límites de círculo
- 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.