2011-07-28 7 views
1

ArcGISのレイヤー(多くのポリゴンで構成されているレイヤー)内のあるポリゴンから他のポリゴンまでの最小距離を見つける方法を見つけようとしました。具体的には、Pythonでループを実行することが可能かどうか、各ポリゴンから他のポリゴンまでの最小距離を見つけることができるのだろうか?あなたはポリゴンの中心座標を持っていればレイヤ内の1つのポリゴンから他のポリゴンまでの最小距離を見つけますか?

おかげで、 ラジブ

答えて

2

は、それが自分でこれを行うことillustratably簡単です。そして、あなたは点のベクトル(listまたは何でも)の中で最も近い点を見つけるために関数を作ることができます

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 

:まず、あなたは同じ寸法の2点間の距離を見つけるために、機能を必要としています。あなたは、多角形の頂点を持っている場合、これはカップルがより複雑なステップである

# 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)) 

が、あなたはそれをステップ・バイ取るかどうかを把握するのは簡単:私は単に迅速なカスタムキー機能をmin()機能を適用しますステップ。最も外側のループは、「ベース」ポリゴン(最小距離を見つけようとしているポリゴン)のポイントを反復処理する必要があります。この中にネストされたループは、比較ベクトルの他のポリゴンのそれぞれに移動します。ここからあなただけの最も近いものを見つけること、この他のポリゴン内の全ての点にごベーシス・ポイントを比較する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_ptvec[i]の頂点である場合に限り、それぞれが0になります。

希望すると便利です。

関連する問題