Предположим, что я рисую полиган, используя буклет, как в следующей демонстрации: http://leaflet.github.io/Leaflet.draw/
Мой вопрос в том, как я могу определить, находится ли данная точка внутри многоугольника или нет.
Предположим, что я рисую полиган, используя буклет, как в следующей демонстрации: http://leaflet.github.io/Leaflet.draw/
Мой вопрос в том, как я могу определить, находится ли данная точка внутри многоугольника или нет.
Используйте алгоритм преобразования лучей, чтобы проверить, находится ли точка (маркер) внутри многоangularьника:
function isMarkerInsidePolygon(marker, poly) {
var polyPoints = poly.getLatLngs();
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
var inside = false;
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
};
См., например, jsfiddle.
Первоначальный источник кода: https://github.com/substack/point-in-polygon/blob/master/index.js
Смотрите также 2014 аналогичный ответ, fooobar.com/questions/629916/...
Вот модифицированная (с подсказками @Sumit) версия ответа @gusper, которая работала для меня: (у меня были пончики)
function isMarkerInsidePolygon(marker, poly) {
var inside = false;
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
for (var ii=0;ii<poly.getLatLngs().length;ii++){
var polyPoints = poly.getLatLngs()[ii];
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
}
return inside;
};
Я обнаружил, что ни один из приведенных выше ответов не работает для подсчета маркеров в несмежных полигонах. Вот пример многоangularьника, в котором вышеуказанные функции возвращают 0 маркеров внутри:
Для тех, кто должен это сделать, пакет Leaflet.PointInPolygon
работал для меня: https://github.com/hayeswise/Leaflet.PointInPolygon
Это немного медленно, но кажется точным.