Leaflet 确定点是否位于传单多边形内

Leaflet 确定点是否位于传单多边形内,leaflet,polygon,point-in-polygon,Leaflet,Polygon,Point In Polygon,假设我使用传单绘制一个多边形,如以下演示中所示: 我的问题是如何确定给定点是否位于多边形内部。使用光线投射算法检查点(标记)是否位于多边形内部: function isMarkerInsidePolygon(marker, poly) { var polyPoints = poly.getLatLngs(); var x = marker.getLatLng().lat, y = marker.getLatLng().lng; var inside =

假设我使用传单绘制一个多边形,如以下演示中所示:


我的问题是如何确定给定点是否位于多边形内部。

使用光线投射算法检查点(标记)是否位于多边形内部:

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;
};
函数isMarkerInsidePolygon(标记,多边形){
var polyPoints=poly.getLatLngs();
变量x=marker.getLatLng().lat,y=marker.getLatLng().lng;
var内=假;
对于(变量i=0,j=polyPoints.length-1;iy)!=(yj>y))
&&(x<(xj-xi)*(y-yi)/(yj-yi)+xi);
如果(相交)内部=!内部;
}
返回内部;
};
例如,见

代码的原始源代码:


另请参见2014年的类似答案,

这里是@gusper-answer的修改版(带有@Sumit提示),它对我有效:(我吃了甜甜圈)

函数isMarkerInsidePolygon(标记,多边形){
var内=假;
变量x=marker.getLatLng().lat,y=marker.getLatLng().lng;
对于(变量ii=0;ii y)!=(yj>y))
&&(x<(xj-xi)*(y-yi)/(yj-yi)+xi);
如果(相交)内部=!内部;
}
}
返回内部;
};

我发现上述答案都不适用于计算非连续多边形中的标记。下面是一个多边形示例,上面的函数在其中返回0个标记:

对于任何需要这样做的人,
传单.PointInPolygon
软件包对我很有用:


这有点慢,但似乎很准确。

如果多边形是闭合的,则可以确定每个线段的方向(内部/外部)。从任意点到无穷远处绘制半直线将以奇数或偶数个线段交点结束(每个方向总是奇数或偶数):偶数个交点是多边形外部的点,奇数是多边形内部的点。因此,您可以选择任何方向,例如x轴:检查
[pt.x,pt.y]-[inf,pt.y]
上的相交线段(您也可以将半线绑定到多边形的边界框)。当然,有一些方法可以更有效地做到这一点:我询问是否有一种方法可以让我确定多边形的纬度和经度,然后确定该点是否在多边形内部,我建议您使用JavaScript增强您的问题a)您的问题和您想要的预期解决方案,b)对您尝试的内容的完整描述,以及c)您的代码far@MajdiTaleb很高兴听到!请投票选出有用的答案(和好问题),并将解决问题的答案标记为“已接受”。这将帮助其他用户。虽然
poly.getLatLngs()
返回一个数组数组,但仍然有效,因此第一行必须是
var polyPoints=poly.getLatLngs()[0]如果你想支持甜甜圈形状的多边形,你需要另一个包装环。任何人都可以看看这个问题吗..谢谢,你节省了我的时间!:)谢谢这正是我想要的。很好。
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;
};