1

ArcGISのレイヤー(レイヤーは多くのポリゴンで構成されています)内の1つのポリゴンから他のポリゴンまでの最小距離を見つける方法を見つけようとしました。より具体的には、各ポリゴンから他のポリゴンまでの最小距離を見つけるループをpythonで実行できるかどうか疑問に思っていましたか?

ありがとう、ラジブ

4

2 に答える 2

3

ポリゴンの中心座標がわかっている場合は、これを自分で行うのは非常に簡単です。まず、同じ次元の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_ptvec[i]

これがお役に立てば幸いです。

于 2011-07-28T19:11:24.793 に答える
0

arcgisツールボックスには次のツールがあります:http: //help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00080000001q000000.htm

于 2012-01-06T16:29:01.940 に答える