Identificar si el punto está en el polígono
Según mi requisito, estoy dibujando los polígonos en el mapa de google mostrado en la imagen abajo. (Usando mapas v2)
Ahora necesito mostrar una alerta cuando el usuario entra en ese polígono particular.
- OnLocationChanged no se ha llamado
- El proveedor de ubicación falsa no funciona
- Cómo rotar la vista del mapa sin problemas con el rodamiento en android
- Convertir GeoPoint en Ubicación
- Ubicación del usuario de Google Maps V2 para Android
Cómo identificar si mi ubicación actual está en el polígono. (Necesidad manera optimizada sin drenar la batería)
Gracias por adelantado.
- Extfiltración del historial de ubicaciones de Google desde la línea de tiempo
- ¿Cómo conseguir que mi ubicación cambie el evento con Google Maps android API v2?
- Cambio de rumbo en Android Google Maps hace que la localización de destino sea diferente
- Cómo obtener el nombre de la calle del objeto Dirección / Ubicación en Android
- Hacer polígonos que se pueden hacer clic en Google Maps (para Android)
- Alternativas a google maps api
Acabo de probar Ray Casting algoritmo que identifica punto en polígono. Esto funciona perfecto.
Consulte http://en.wikipedia.org/wiki/Point_in_polygon para la tesis de Ray-Casting
private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) { int intersectCount = 0; for (int j = 0; j < vertices.size() - 1; j++) { if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) { intersectCount++; } } return ((intersectCount % 2) == 1); // odd = inside, even = outside; } private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) { double aY = vertA.latitude; double bY = vertB.latitude; double aX = vertA.longitude; double bX = vertB.longitude; double pY = tap.latitude; double pX = tap.longitude; if ((aY > pY && bY > pY) || (aY < pY && bY < pY) || (aX < pX && bX < pX)) { return false; // a and b can't both be above or below pt.y, and a or // b must be east of pt.x } double m = (aY - bY) / (aX - bX); // Rise over run double bee = (-aX) * m + aY; // y = mx + b double x = (pY - bee) / m; // algebra is neat! return x > pX; }
Encontré el método de ray-casting poco fiable, pero terminé usando el PolyUtil
de google maps.
Necesita la compile 'com.google.maps.android:android-maps-utils:0.5'
dependencias compile 'com.google.maps.android:android-maps-utils:0.5'
Y entonces el método se parece a esto
PolyUtil.containsLocation(userLocation, polyPointsList, false);
Referir este enlace
Polygon Detección táctil Google Map API V2
Su algoritmo RayCasting, puede ayudarle 🙂
Una breve descripción sobre el algoritmo:
Una línea horizontal se dibuja de su punto a la derecha, si intersecta los lados del polígono en el número impar de veces entonces el punto está dentro del polígono más exterior 🙂
Estos enlaces wiki te darán una idea completa: