假设我使用leaflet绘制了一个多边形,就像下面这个演示一样:
http://leaflet.github.io/Leaflet.draw/
我的问题是如何确定给定的点是否在多边形内部。
使用射线投射算法检查点(标记)是否位于多边形内:
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年类似的答案:https://dev59.com/iVgR5IYBdhLWcg3wm-K6#41138512
poly.getLatLngs()
返回一个数组的数组,所以第一行必须是 var polyPoints = poly.getLatLngs()[0];
,这样才能正常工作。如果您想支持环状多边形,则需要添加另一个循环包装。 - ProblemsOfSumit这是经过@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;
};
Leaflet.PointInPolygon
包: https://github.com/hayeswise/Leaflet.PointInPolygon
虽然速度有点慢,但似乎很准确。
[pt.x,pt.y]-[inf,pt.y]
上的相交线段(您还可以将半线限制在多边形的边界框内)。当然,有更有效的方法来实现这一点:https://en.wikipedia.org/wiki/Point_location - BeyelerStudios