【发布时间】: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