2014-07-13 52 views
3

我有一個函數可以獲取經度和緯度座標,並返回與包含座標的多邊形有關的信息。換句話說:如何在不規則多邊形內找到一個點

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)測試了這兩個函數,但是當我將它應用於大多數真實數據時,函數停止工作。

是否有任何因素會影響這些函數給出錯誤的否定結果,例如多邊形大小,座標的小數位數或其他這樣的瑣事?

+1

誰是你的真正多邊形?是否有零長度段,重複點,交叉線等? – Daniel

+0

在我看來,最簡單的方法是手動將多邊形分成三角形 - 您可以編寫一個算法來實現我的想法:然後,您可以檢測您的長/拉特坐在哪個定義的三角形中 - 這是我覺得很容易。 –

+1

我只想說問題已經解決了。我監督的數據有一個怪癖。我正在離開這個問題,因爲我非常喜歡這兩個功能。 – Roman

回答

0

找到一個點是否在一個多邊形內的most common approach之一是測試從該點開始並沿任何方向行進的線與多邊形的邊界交叉的次數。 Check this question in stackoverflow瞭解更多信息和具體示例。

順便說一句,Shapely是一個測試良好的庫。我不認爲它會不正確地工作,可能是你的多邊形或你使用它的方式有問題。

0

這是我用過的成功算法。

在多邊形之外尋找一個點 - 只需選擇一個大於最大值的xy

畫一條線,在你的頭上,從點到面的外點..

計數與線段組成的多邊形的周長是這條線的交叉點的數目。如果它很奇怪,那麼這個點就在裏面。如果甚至,它在外面。

另一種方法是使用圖形多邊形洪水填充功能來填充白色背景上的一個紅色的多邊形,然後看看你的觀點是什麼顏色的?

0

您也可以使用QHull。 Python的工具帶有SciPy的(http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.ConvexHull.html#scipy.spatial.ConvexHull

您只需提供您的多邊形的coordiantes你正在尋找到ConvexHull點一起,它會返回一組vertices形成所有點的外邊界。如果你的觀點是這些頂點之一,那麼你就知道你的觀點像外面。 Otherwsie,它在裏面。然而,scipy.spatial對於你正在做的事情類型有很多功能,你可能想看看。

相關問題