如何在不规则多边形内找到一个点

时间:2014-07-13 08:16:54

标签: python

我有一个获取纬度和经度坐标的函数,并返回与包含坐标的多边形相关的信息。换句话说:

def coords_to_info(lat, lng):
    #check in which polygon the point lies
    return polyName

检查点是否在多边形内部,我尝试了两种不同的函数:

def point_in_poly(x,y,poly):
    """
    function to check if a point is in a 2D polygon
    """
    n = len(poly)
    inside = False

    p1x,p1y = poly[0]
    for i in range(n+1):
        p2x,p2y = poly[i % n]
        if y > min(p1y,p2y):
            if y <= max(p1y,p2y):
                if x <= max(p1x,p2x):
                    if p1y != p2y:
                        xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
                    if p1x == p2x or x <= xints:
                        inside = not inside
        p1x,p1y = p2x,p2y

    return inside

print point_in_poly(lat, lng, lBoundary)

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

coordPoint = Point(lat, lng)
coordPolygon = Polygon(lBoundary)

print coordPolygon.contains(coordPoint)

lBoundary是一个关闭的元组列表(第一个和最后一个点相等):[(a,b),(c,d),(e,f),(a,b)]

这两种方法都适用于测试数据和小凸数据,但对于大多数实际数据多边形都返回false。

我已经使用模拟数据测试了这两个函数(我测试了all these types of polygons),但是当我将它应用于我的大部分实际数据时,函数停止工作。

是否有任何因素会影响这些函数以产生漏报,例如多边形大小,坐标小数位或其他此类无关紧要?

3 个答案:

答案 0 :(得分:0)

要找到一个点在多边形内部的most common approach之一是测试从该点开始并沿任何方向行进的线与多边形边界交叉的次数。 Check this question in stackoverflow了解更多信息和具体示例。

BTW,Shapely是一个经过良好测试的库。我不认为它会不正常工作,可能是你的多边形或你使用它的方式有问题。

答案 1 :(得分:0)

这是我成功使用的算法。

在多边形外部找到一个点 - 只需选择大于最大值的xy

在你的头部画一条线,从你的点到多边形外的点。

计算此线与构成多边形周长的线段的交点数。如果它是奇数,则该点在内部。如果是偶数,它就在外面。

另一种方法是使用图形多边形泛光填充功能在白色背景上填充红色多边形,然后看看你的点是什么颜色......

答案 2 :(得分:0)

您也可以使用QHull。 Python实现随Scipy(http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.ConvexHull.html#scipy.spatial.ConvexHull

一起提供

您可以简单地将多边形的coordiantes与您正在查看的点一起提供给ConvexHull,它将返回构成所有点的外边界的vertices组。如果你的观点是这些顶点中的一个,那么你就知道你的观点就像在外面一样。其他,它在里面。尽管如此,scipy.spatial对于你正在做的事情类型有很多功能,你可能想看看它。