我有一個函數可以獲取經度和緯度座標,並返回與包含座標的多邊形有關的信息。換句話說:如何在不規則多邊形內找到一個點
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)]
Both approaches wor k完美適用於測試數據和小型凸面數據,但對於大多數實際數據多邊形都會返回false。
我已經用模擬數據(我測試了all these types of polygons)測試了這兩個函數,但是當我將它應用於大多數真實數據時,函數停止工作。
是否有任何因素會影響這些函數給出錯誤的否定結果,例如多邊形大小,座標的小數位數或其他這樣的瑣事?
誰是你的真正多邊形?是否有零長度段,重複點,交叉線等? – Daniel
在我看來,最簡單的方法是手動將多邊形分成三角形 - 您可以編寫一個算法來實現我的想法:然後,您可以檢測您的長/拉特坐在哪個定義的三角形中 - 這是我覺得很容易。 –
我只想說問題已經解決了。我監督的數據有一個怪癖。我正在離開這個問題,因爲我非常喜歡這兩個功能。 – Roman