ModelBuilderの反復機能選択に相当するPythonとは何ですか?


8

私のデータは2つのフィーチャクラスで構成されています。

  1. ポイント=木を表すポイント
  2. ポリゴン=キャノピーの面積による面積を表すポリゴン。FCの各ポリゴンには、属性にキャノピー測定値があります。

私は以下を達成しようとしています:

  1. ポリゴンフィーチャの下のポイントを選択します
  2. 各ポリゴンの下のポイントについて、ポリゴン属性に基づいてポイントのX%を削除します

スクリーンショット(図1)は、反復機能選択と呼ばれるModelBuilder専用ツールを示しています。 機能をSelectLayerByLocation_managementコマンドに渡すために、機能クラスの機能を反復処理する正しいPythonスクリプトメソッドは何ですか?

図2は、select by locationの出力を示しています。4つのレイヤーはすべて同じです。これは、キャノピーの%測定でポイントを削除しようとすると問題になります。

これは私がこれまでに試したことです:

import arcpy
from arcpy import env

env.overwriteOutput = True
env.workspace = r'C:\temp_model_data\OutputData'
outWorkspace = env.workspace

# The polygons have canopy % data in attributes
polygons = r'C:\temp_model_data\CanopyPercentages.shp'
points = r'C:\temp_model_data\points_20_2012.shp'

if arcpy.Exists("pointsLayer"):
    print "pointsLayer exists already"
else:
    arcpy.MakeFeatureLayer_management (points, "pointsLayer")
    print "pointsLayer created"

count = 1

#Create a search cursor to step through the polygon features
polys = arcpy.da.SearchCursor(polygons, ["OID@", "SHAPE@"])

for poly in polys:

    # Create a name for the polygon features
    count = count + 1
    featureName = "polygon_" + str(count)
    print featureName

    # Select points that lie under polygons
    arcpy.SelectLayerByLocation_management('pointsLayer', 'intersect', polygons)
    arcpy.SaveToLayerFile_management('pointsLayer', outWorkspace + featureName + ".lyr", "ABSOLUTE")

    # Add the random point selection script here...

    # Delete selected points within each polygon based on the % canopy cover...

図1 ここに画像の説明を入力してください

図2 ここに画像の説明を入力してください


2
私はあなたのコードを調べていますが、簡単に言うと、ポリゴン名は2から始まります。カウントは、名前が設定される前に増分されます。ループの開始前にcount = 0を設定するか、機能名を割り当てた後にcount = count + 1(短縮してcount + = 1にすることができます)を配置する必要があります。
HeyOverThere 2013

回答:


10

SearchCursor arcpyでは、これを達成するための最も直接的なルートです。

import arcpy

fc = "c:/data/base.gdb/roads"
field = "StreetName"
cursor = arcpy.SearchCursor(fc)
row = cursor.next()
while row:
    print(row.getValue(field))
    row = cursor.next()

where_clauseプロパティを使用して選択を実行できることに注意してください。


11

Nick OchoskiはSearchCursorについては正しいですが、しばらく使わずに手動でnextを呼び出すよりクリーンな方法があります。

import arcpy
fc = "c:/data/base.gdb/roads"
field = "StreetName"
cursor = arcpy.SearchCursor(fc)
for row in cursor:
    print(row.getValue(field))

9

終了後にカーソルが自動的に削除されるため、よりクリーンなコードのために(trevstanhopeのきちんとした答えに)WITHを追加することもできると思います

import arcpy
fc = "c:/data/base.gdb/roads"
field = "StreetName"
with arcpy.da.SearchCursor(fc) as cursor:
    for row in cursor:
        print(row.getValue(field))

フィーチャにアクセスして情報を取得するために検索カーソルを使用しましたが、ジオプロセシングを各行で実行できますか、またはその行のIDをプルしてから、そのIDを使用して属性による選択を実行し、ジオプロセシングを実行する必要があります。 ?
レックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.