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

时间:2015-08-03 14:47:32

标签: leaflet polygon point-in-polygon

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

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

3 个答案:

答案 0 :(得分:29)

使用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;
};

例如,请参阅jsfiddle

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

另见2014年的类似答案https://stackoverflow.com/a/41138512/287948

答案 1 :(得分:10)

以下是@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;
        };

答案 2 :(得分:1)

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

Non-contiguous Polygon

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

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