检查点是否在多边形内

问题描述 投票:57回答:5

我想检查一个点是否位于特定的多边形内。多边形为:

 polygon=   [ [-73.89632720118, 40.8515320489962],
              [-73.8964878416508, 40.8512476593594],
              [-73.8968799791431, 40.851375925454],
              [-73.8967188588015, 40.851660158514],
              [-73.89632720118, 40.8515320489962] ]

我要检查的要点是:

1 = [40.8515320489962,-73.89632720118]
2 = [40.8512476593594,-73.8964878416508]
3 = [40.851375925454,-73.8968799791431]
4 = [40.851660158514,-73.8967188588015]
5 = [40.8515320489962,-73.89632720118]

我如何确定这些点中的每一个是否都位于该多边形内?

以下算法不起作用。我不知道为什么

pt[lat,long]

function isPointInPoly(poly, pt){
    for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
        ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1] < poly[i].y))
        && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
        && (c = !c);
    return c;
}

我不想使用第三方解决方案,例如google maps API或此https://github.com/mattwilliamson/Google-Maps-Point-in-Polygon

我的尝试在这里:http://jsfiddle.net/nvNNF/2/

javascript polygon
5个回答
82
投票

[在Github上有一个项目,代码为https://github.com/substack/point-in-polygon(MIT许可证):

function inside(point, vs) {
    // ray-casting algorithm based on
    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

    var x = point[0], y = point[1];

    var inside = false;
    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }

    return inside;
};

用法:

// array of coordinates of each vertex of the polygon
var polygon = [ [ 1, 1 ], [ 1, 2 ], [ 2, 2 ], [ 2, 1 ] ];
inside([ 1.5, 1.5 ], polygon); // true

测试功能在这里:https://github.com/substack/point-in-polygon/blob/master/index.js

注意:当该点是多边形的一个角或在一条边上时,此代码无法可靠地工作。这里有一个改进的版本:https://github.com/mikolalysenko/robust-point-in-polygon


9
投票

您的多边形数组看起来像GeoJSON多边形结构中的coordinates数组(有关更多信息,请参见https://macwright.org/2015/03/23/geojson-second-bite.htmlhttp://geojson.org)。因此,也许您可​​以使用正在处理geoJSON数据的库?在Is it possible to determine if a GeoJSON point is inside a GeoJSON polygon using JavasScript?]中查看对OP的答案和评论

总之,我的日子被turfhttps://github.com/turfjs/turf)保存了也有d3https://github.com/d3/d3-geo#geoContains),但我对此有疑问。

UPD:我注意到当点位于多边形的“边缘”上时,turf给出的结果不一致。我创建了问题,正在等待开发人员的答复。

UPD2:通过使用最新版本的turf解决了“边界点”问题(我使用3.0.14而不是4.6.1)。现在就可以了。


9
投票

这是我终于开始使用的功能。我通过在here中将C代码用于javascript来获得它(有解释)。


0
投票

就我而言,我做了以下事情对我来说很好用


0
投票

跟随@AaronDigulla,如果我们只需要一个函数,并且避免使用任何其他库,他的回答很有趣。这是代码的一个版本,更加简洁,但是我没有检查性能是否相似。

© www.soinside.com 2019 - 2024. All rights reserved.