我有一个函数,它获取纬度和经度坐标,并返回与包含坐标的多边形相关的信息。换句话说:
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 ),但是当我将它应用于我的大部分真实数据时,这些函数停止工作。
是否有任何因素会影响这些函数给出漏报,例如多边形大小、坐标的小数位或其他此类琐碎的事情?
最佳答案
most common approach 之一查找一个点是否在多边形内部是测试从该点开始并沿任意方向延伸的线穿过多边形边界的次数。 Check this question in stackoverflow获取更多信息和具体示例。
顺便说一句,Shapely是一个经过良好测试的库。我不认为它会工作不正常,可能是您的多边形或您使用它的方式有问题。
关于python - 如何在不规则多边形内找到一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720768/