para - polygon android
Identificar si el punto está en el polígono. (3)
Consulte este enlace
Detección de polígonos táctiles Google Map API V2
Su algoritmo RayCasting te puede ayudar :)
Una breve descripción sobre el algoritmo:
Se dibuja una línea horizontal desde su punto a la derecha, si se cruza con los lados del polígono en el número impar de veces, entonces el punto está dentro del polígono o en el exterior :)
Estos enlaces wiki te darán una idea completa:
Según mi requerimiento, estoy dibujando polígonos en el mapa de Google que se muestra en la imagen a continuación. (Usando los mapas v2)
Ahora necesito mostrar una alerta cuando el usuario ingresa a esos polígonos en particular.
Cómo identificar si mi ubicación actual está en el polígono. (Necesita una forma optimizada sin agotar la batería)
Gracias por adelantado.
Encontré que el método de PolyUtil
de rayos no es confiable, 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 ve así.
PolyUtil.containsLocation(userLocation, polyPointsList, false);
EDITAR
Esta es la descripción de este método que se encuentra en el código fuente.
Calcula si el punto dado se encuentra dentro del polígono especificado. El polígono siempre se considera cerrado, independientemente de si el último punto es igual al primero o no. Dentro se define como que no contiene el Polo Sur, el Polo Sur siempre está afuera. El polígono está formado por segmentos de gran círculo si la geodésica es cierta y, de lo contrario, por segmentos rítmicos (loxodrómicos).
Solo probé el algoritmo Ray Casting que identifica el punto en el polígono. Esto funciona perfecto.
Consulte http://en.wikipedia.org/wiki/Point_in_polygon para ver 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;
}