Python 如何在不规则多边形中查找点

Python 如何在不规则多边形中查找点,python,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

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

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)
lBoundary是一个封闭的元组列表(第一个点和最后一个点相等):[(a,b),(c,d),(e,f),(a,b)]

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

我已经用模拟数据对这两个函数进行了相当广泛的测试(我已经测试过),但是当我将它应用到我的大多数实际数据时,这些函数就停止工作了

是否有任何因素会影响这些函数给出假阴性,例如多边形大小、坐标的小数位数或其他类似的琐事?

要确定一个点是否在多边形内,其中一个方法是测试从该点开始并沿任何方向穿过多边形边界的直线的次数。以获取更多信息和具体示例


顺便说一句,这是一个经过良好测试的库。我不认为它工作不正确,可能是多边形或使用方式有问题。

以下是我成功使用的算法

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

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

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


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

您也可以使用QHull。Python实现附带了Scipy()


您可以简单地将多边形的坐标与您正在查看的点一起提供给
ConvexHull
,它将返回构成所有点的外部边界的
顶点集。如果你的点是这些顶点中的一个,那么你知道你的点类似于外部。另外,它就在里面。尽管如此,
scipy.spatial
对于您正在做的事情有很多函数,您可能想看看这些函数

谁是你真正的多边形?是否存在零长度段、重复点、交叉线,等等?在我看来,最简单的方法是手动将多边形分割成三角形-你可以编写一个算法来实现这一点,我认为:然后你可以检测出你的long/lat位于哪个定义的三角形中-我认为这相当容易。我只想说问题本身就解决了。我监督的数据中有一个怪癖。我不提这个问题,因为我非常喜欢这两个函数。
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

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

print coordPolygon.contains(coordPoint)