ArcPyにはジオメトリの空間検索機能はありますか?


10

私の問題:ArcPyを使用して、バッファーをループして各バッファー内のgeometry_featuresを選択し、その特定のバッファー内で見つかったオブジェクトのみに何か(更新)を実行したいと考えています。以下のコードは、私が何をしたいかを説明しています(多かれ少なかれ):

def _update_connections_inside_buffers(self):
    buffers = arcpy.SearchCursor(self.__buffer_class_name)
    in_layer = "connections"
    for i_buffer in buffers:
        shape = i_buffer.shape
        # can not use a geometry to do a selection.. very inconvenient!!
        connections = arcpy.SelectLayerByLocation_management(in_layer, "WITHIN", shape) 
        self._update_connections(connections)

ただし、これは機能しません。SelectLayerByLocation_management()はジオメトリ、「形状」を引数として受け入れませんが、feature_class_name(レイヤー名)を想定しているためです。空間述語を使用して検索できるarcpyメソッドはありますか?Esriマニュアルからこれを行う方法を見つけることができませんでした。

回答:


13

トレーニングコースの1つで以下のコードを使用しているので、このようなことができると確信しています。機能していないように見える場合は、ArcMapのコンテンツウィンドウでレイヤーを使用するか、ArcMapの外部でMakeFeatureLayerを使用してレイヤーオブジェクトを定義していない可能性があります。

あるいは、問題を引き起こしているのはSelectLayerByLocationの隣の "connections ="だと思います。それをResultオブジェクトに設定し、それを何も抽出せずに渡して戻すためです。

import arcpy
schoolsLayer = "Schools"
suburbsLayer = "Suburbs"
# get an update cursor as we will be changing values
rows = arcpy.UpdateCursor(suburbsLayer)
# loop through each suburb in the layer
for row in rows:
    polygon = row.SHAPE
    arcpy.SelectLayerByLocation_management(schoolsLayer,"INTERSECT",polygon)

2

これは可能ですが、私の知る限り、arcpyを使用したフィーチャレイヤーを使用することによってのみ可能です。基本的に、where句を作成してOID(または他の一意に識別するフィールド)で更新し、SelectLayerByLocationをループします。

PSUマスターのプログラムからこのチュートリアルを確認してください。私が間違っていない場合、それはあなたが何を求めているかをほぼ正確にカバーしています。

ジオメトリへの参照は必要ありません。空間クエリは、定義するクエリのタイプに基づいてジオメトリを使用します(つまり、完全に含む、境界を共有するなど)。これらのポイントのジオメトリを参照する必要がある場合は、それらがバッファ内にあると判断されたら、それらをPythonリストに追加し(OID)、where句を使用して元のデータセットを操作します。


私は問題の解決策を見つけました。class_layerを参照する文字列ではなく、feature_layerを最初の引数として指定する必要がありました。
user8175 2012年

1

私は問題の解決策を見つけました。class_layerを参照する文字列ではなく、feature_layerを最初の引数として指定する必要がありました。」

    # Make a feature layer from the feature class
    class_layer = arcpy.env.workspace + "." + "connections"
    arcpy.MakeFeatureLayer_management(class_layer, "feature_layer")

    # Do selection using feature_layer 
    arcpy.SelectLayerByLocation_management("feature_layer", "WITHIN", p_polygon)

    # get result
    connections_found_in_polygon = arcpy.SearchCursor("feature_layer")
    self._update_connections(connections_found_in_polygon)

3
PolyGeoの回答がこれをカバーしていると確信しています。フィーチャクラスとフィーチャレイヤー違いに注意してください。
blah238
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.