studio para google example android google-maps geolocation android-maps-v2 polygons

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:

http://en.wikipedia.org/wiki/Point_in_polygon

http://rosettacode.org/wiki/Ray-casting_algorithm

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; }