28

假设我在下面的演示中使用传单绘制一个多边形:http: //leaflet.github.io/Leaflet.draw/

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

4

3 回答 3

49

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

于 2015-08-04T15:45:38.653 回答
17

这是对我有用的@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;
};
于 2017-03-01T13:04:59.143 回答
8

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

非连续多边形

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

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

于 2019-10-02T17:53:43.017 回答