2017-09-17 20 views

答えて

2

g1.hausdorff_distance(g2)のfuctionによって返されるHausdorff distanceを、試してみてください。

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/)でlat/lonポイントの各ペアから取得します。 –

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

2つの観察。 1)ポリゴンの頂点で実際に最大距離が達成されていることは容易にわかるので、メソッドは正確です。 2)配列内の距離を累積して最大になるように並べ替えることは、変数に最大値を格納し、距離を計算する間に比較する場合に比べて非常に非効率的です。両方の処理でメモリ使用量。 – eguaio

+0

@eguaioヒントありがとう、私は答えを更新しました。あなたの最初の点について:最長距離は 'math.sqrt((4 ** 2)+(4 ** 2))= 5.656854249492381'ですが、関数は少し異なるものを返します。 'num'引数を増やすと精度が上がります(例で説明しようとしたように)。 –

関連する問題