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/
Ответы
Ответ 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). Все прямо сейчас.