ArcGISのレイヤー(レイヤーは多くのポリゴンで構成されています)内の1つのポリゴンから他のポリゴンまでの最小距離を見つける方法を見つけようとしました。より具体的には、各ポリゴンから他のポリゴンまでの最小距離を見つけるループをpythonで実行できるかどうか疑問に思っていましたか?
ありがとう、ラジブ
ポリゴンの中心座標がわかっている場合は、これを自分で行うのは非常に簡単です。まず、同じ次元の2点間の距離を見つける関数が必要です。
def euclid(pt1, pt2):
pairs = zip(pt1, pt2) # Form pairs in corresponding dimensions
sum_sq_diffs = sum((a - b)**2 for a, b in pairs) # Find sum of squared diff
return (sum_sq_diffs)**(float(1)/2) # Take sqrt to get euclidean distance
list
次に、点のベクトル(またはその他)の中から最も近い点を見つける関数を作成できます。min()
簡単なカスタムキー関数を使用して関数を適用するだけです。
# Returns the point in vec with minimum euclidean distance to pt
def closest_pt(pt, vec):
return min(vec, key=lambda x: euclid(pt, x))
ポリゴンの頂点がある場合、これは数ステップ複雑ですが、ステップバイステップで実行すると簡単に理解できます。最も外側のループは、「ベース」ポリゴン(最小距離を見つけようとしているポリゴン)のポイントを反復処理する必要があります。この中にネストされたループは、比較ベクトル内の他の各ポリゴンに移動するはずです。ここから、closest_pt()
関数を呼び出して、ベーシスポイントをこの他のポリゴン内のすべてのポイントと比較し、最も近いポイントを見つけることができます。
def closest_poly(basis, vec):
closest = []
for (i, pt) in basis:
closer = []
for poly in vec:
closer.append(closest_pt(pt, poly))
closest.append(closest_pt(pt, closer))
best = min(enumerate(closest), key=lambda x: euclid(basis[x[0]], x[1]))
return (best[0], best[1], [best[1] in poly for poly in vec])
構造的に少し冗長かもしれませんが、うまくいくと思いますし、かなり透過的なロジックを提供します。この関数は、のペアを返します(vertex, close_pt, polys)
。ここで、vertex
は、別のポリゴンに最も近いことがわかった、ベースの頂点のインデックスです。close_pt
最も近いポイントを含むことがわかった他のポリゴンのポイントです。とpolys
は、のポリゴンに対応するブール値のリストですvec
。たとえば、がの頂点であるpolys[i] == True
場合に限ります。close_pt
vec[i]
これがお役に立てば幸いです。
arcgisツールボックスには次のツールがあります:http: //help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00080000001q000000.htm