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

Maj*_*leb 12 polygon point-in-polygon leaflet

假设我使用传单绘制polygan,如下面的演示:http://leaflet.github.io/Leaflet.draw/

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

gus*_*per 32

使用Ray Casting算法检查点(标记)是否位于多边形内:

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;
};
Run Code Online (Sandbox Code Playgroud)

例如,请参阅jsfiddle.

代码的原始来源:https://github.com/substack/point-in-polygon/blob/master/index.js


另请参阅2014年的类似答案,/sf/answers/2879695871/

  • 尽管`poly.getLatLngs()`返回一个数组数组,所以第一行必须是`var polyPoints = poly.getLatLngs()[0];`如果你想支持圆环形多边形,你需要另一个包裹循环. (4认同)

Vit*_*lyZ 13

这是@gusper答案的修改后的(带@Sumit提示)版本,对我有用:(我有甜甜圈)

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;
};
Run Code Online (Sandbox Code Playgroud)


lau*_*tta 7

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

非连续多边形

对于任何需要这样做的人,该Leaflet.PointInPolygon软件包对我有用https : //github.com/hayeswise/Leaflet.PointInPolygon

这有点慢,但似乎是准确的。