Подтвердить что ты не робот

JS- Проверьте, находится ли полигон Point Inside A

Я хочу проверить, принадлежит ли точка определенной полигоне Я написал многоугольник таким образом

 polygone=   [
                        [-73.89632720118, 40.8515320489962],
                        [-73.8964878416508, 40.8512476593594],
                        [-73.8968799791431, 40.851375925454],
                        [-73.8967188588015, 40.851660158514],
                        [-73.89632720118, 40.8515320489962]
                    ]

Этот точечный вход =

[40.8515320489962,-73.89632720118,40.8512476593594,-73.8964878416508,40.851375925454,-73.8968799791431,40.851660158514,-73.8967188588015,40.8515320489962,-73.89632720118]

Я хочу проверить, принадлежит ли точка этому полигону или нет. Как я могу это сделать:

Это алгоритмы не вызывают: я не знаю, почему. пт [лат, длинные]

   function isPointInPoly(poly, pt){
        for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
            ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1] < poly[i].y))
            && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
            && (c = !c);
        return c;
    }

Я не хочу использовать сторонние решения (такие как google maps api), как этот: https://github.com/mattwilliamson/Google-Maps-Point-in-Polygon

Вы можете проверить код LIVE: http://jsfiddle.net/nvNNF/2/

4b9b3361

Ответ 1

Существует проект Github с кодом: https://github.com/substack/point-in-polygon (лицензия MIT):

function inside(point, vs) {
    // ray-casting algorithm based on
    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

    var x = point[0], y = point[1];

    var inside = false;
    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }

    return inside;
};

Использование:

// array of coordinates of each vertex of the polygon
var polygon = [ [ 1, 1 ], [ 1, 2 ], [ 2, 2 ], [ 2, 1 ] ];
inside([ 1.5, 1.5 ], polygon); // true

Функция тестирования здесь: https://github.com/substack/point-in-polygon/blob/master/index.js

Примечание. Этот код не работает надежно, когда точка является углом многоугольника или края. Здесь есть улучшенная версия: https://github.com/mikolalysenko/robust-point-in-polygon

Ответ 2

Вот функция, в которой я наконец работал. Я получил его, приняв здесь код C на javascript (с объяснением) ссылка

    function checkcheck (x, y, cornersX, cornersY) {

        var i, j=cornersX.length-1 ;
        var  oddNodes=false;

        var polyX = cornersX;
        var polyY = cornersY;

        for (i=0; i<cornersX.length; i++) {
            if ((polyY[i]< y && polyY[j]>=y ||  polyY[j]< y && polyY[i]>=y) &&  (polyX[i]<=x || polyX[j]<=x)) {
              oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x); 
            }
            j=i; 
        }

          return oddNodes;
    }

где cornersX = массив с массивами вершин x или широты, cornersY = массив с y или долгота. X, Y - широта и долгота тестируемой точки

Напишите мне, если у вас есть вопрос

Ответ 3

Ваш многоугольный массив выглядит как массив coordinates в структуре многоугольника GeoJSON (читайте больше на https://macwright.org/2015/03/23/geojson-second-bite.html и http://geojson.org). Возможно, вы можете использовать библиотеки, которые работают с данными geoJSON? Посмотрите ответ и комментарии к OP в Можно ли определить, находится ли точка GeoJSON внутри многоугольника GeoJSON с использованием JavasScript?

Короче говоря, мой день был сохранен turf (https://github.com/turfjs/turf) Существует также d3 (https://github.com/d3/d3-geo#geoContains), но у меня были проблемы с ним.

UPD: Я заметил, что turf дает несогласованные результаты, когда точка находится на "краю" многоугольника. Я создал проблему, и я жду ответа от разработчиков.

UPD2: Проблема с граничными точками разрешается с использованием последней версии turf (я использовал 3.0.14 вместо 4.6.1). Все прямо сейчас.