2017-09-17 145 views

回答

2

嘗試Hausdorff distance,這是由g1.hausdorff_distance(g2)機能的研究返回:

from shapely.geometry import Polygon, Point 
poly = Polygon([(-1, -1), (-2, 2), (4, 4), (4, -1), (-1, -1)]) 
p = Point(0, 0) 
poly.hausdorff_distance(p) # 5.656854249492381 

請記住,身材勻稱只適用於笛卡爾空間。你的問題詢問「經度和緯度」,所以這些距離單位是度數。您需要將其投影到合適的座標參考系統(CRS)中以獲得更多常規單位長度。此外,「直路徑」的定義根據CRS的選擇而變化。

+0

有什麼方法可以在Python中用CRS實現? –

+0

你可以使用[pyproj](https://github.com/jswhit/pyproj)([這種方式](https://gis.stackexchange.com/q/127427/1872))來投影幾何圖形,並找到來自[此地圖預測列表](https://en.wikipedia.org/wiki/List_of_map_projections)的良好預測 –

+0

不涉及選擇投影的另一種策略是找到反測地距離's12'從[geographiclib](https://geographiclib.sourceforge.io/html/python/)的每一對經緯度點開始。 –

0

一種方法是離散多邊形的外觀爲點的集合,並計算在這組點的點和每個點之間的距離:

def longest(poly, p, num): 

    lr = LinearRing(poly.exterior.coords) 
    dist = 0 
    for i in np.linspace(0, lr.length, num): 
     d = p.distance(lr.interpolate(i)) 
     if d > dist: 
      dist = d 
    return dist 


poly = Polygon([(-1, -1), (-2,2), (4,4), (4, -1), (-1, -1)]) 
p = Point(0,0) 
longest(poly, p, 20) 
# out: 5.428886519426354 
longest(poly, p, 100) 
# out: 5.622291976018042 

當然是不準確的,但它可以對許多情況來說是一個合理的近似值。

備註:你不應該使用lon/lat來調整距離。勻稱基於笛卡爾座標系。一般來說,您應該首先投影您的幾何圖形(使用pyproj),以便能夠使用勻稱來測量距離。

+1

兩個意見。 1)很容易看出,最大距離實際上是在多邊形頂點實現的,所以方法是精確的。 2)在一個數組中存儲距離,然後對它進行排序以獲得最大值的效率相比將最大值存儲在變量中並在計算距離時進行比較效率非常低。在處理內存使用情況。 – eguaio

+0

@eguaio感謝您的提示,我更新了答案。關於你的第一點:最長距離是'math.sqrt((4 ** 2)+(4 ** 2))= 5.656854249492381',而函數返回的內容稍有不同。增加'num'參數可以提高準確性(正如我在示例中試圖說明的那樣)。 –

相關問題