【问题标题】:How to find a point inside an irregular polygon如何在不规则多边形内找到一个点
【发布时间】:2014-07-13 08:16:54
【问题描述】:

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

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),但是当我将它应用于我的大部分真实数据时,函数停止工作。

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

【问题讨论】:

  • 谁是你真正的多边形?是否存在零长度段、重复点、交叉线等?
  • 在我看来,最简单的方法是手动将多边形分成三角形 - 你可以编写一个算法来做到这一点:然后你可以检测你定义的三角形中的哪个长/lat 坐在那里 - 我认为这很容易。
  • 我只想说问题自己解决了。我监督的数据中有一个怪癖。我留下这个问题是因为我非常喜欢这两个功能。

标签: python


【解决方案1】:

其中一个most common approach 用于查找某个点是否在多边形内,即测试从该点开始向任意方向延伸的线与多边形边界相交的次数。 Check this question in stackoverflow 了解更多信息和具体示例。

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

【讨论】:

    【解决方案2】:

    这是我成功使用的算法。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      您可以简单地将多边形的坐标连同您正在查看的点一起提供给ConvexHull,它将返回构成所有点外边界的vertices 的集合。如果您的点是这些顶点之一,那么您知道您的点就像在外面。否则,它就在里面。尽管如此,scipy.spatial 有很多功能可以用于您正在做的事情,您可能想看看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 2012-12-17
        • 2012-03-30
        • 2012-04-05
        • 2014-05-12
        • 1970-01-01
        相关资源
        最近更新 更多