Определить, находится ли точка в полигоне

согласно моему требованию, я рисую полигоны на карте google, показанной на изображении ниже.(используя карты версии v2) enter image description here

теперь мне нужно показать предупреждение, когда пользователь вводит эти конкретные полигоны.

Как определить, является ли мое текущее местоположение в полигоне. (Нужен оптимизированный способ без слива батареи)

спасибо заранее.

3 ответов


просто попробовал алгоритм литья лучей, который идентифицирует точку в полигоне. Это работает идеально.

Refer http://en.wikipedia.org/wiki/Point_in_polygon для диссертации Луч-отливки

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

Я нашел метод литья лучей ненадежным, но я в конечном итоге использовал PolyUtil из Google maps.

вам нужна зависимость compile 'com.google.maps.android:android-maps-utils:0.5'

и тогда метод выглядит так

PolyUtil.containsLocation(userLocation, polyPointsList, false);

редактировать

Это описание этого метода можно найти в исходном коде

вычисляет, находится ли данная точка внутри указанного многоугольника. Полигон всегда считается закрытым, независимо от того, равна ли последняя точка первый или нет. Внутренний определяется как не содержащий Южного полюса - Южный полюс всегда снаружи. Многоугольник формируется из сегментов большого круга, если геодезическая истинна, и из rhumb (loxodromic) сегментов в противном случае.


см. ссылку

полигон сенсорного обнаружения Google Map API V2

алгоритм RayCasting, это может помочь вам :)

краткое описание алгоритма:

горизонтальная линия рисуется от вашей точки вправо, если она пересекает стороны многоугольника нечетное число раз, то точка находится внутри многоугольника снаружи:)

эти ссылки wiki дадут вам полный идея:

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

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