Apa yang setara dengan Python dari Pemilihan Fitur Iterate ModelBuilder?

8

Data saya terdiri dari dua kacamata fitur:

  1. Poin = poin yang mewakili pohon
  2. Poligon = Poligon yang mewakili% area kanopi berdasarkan area. Setiap poligon di FC memiliki% pengukuran kanopi dalam atribut.

Saya mencoba mencapai yang berikut:

  1. Pilih titik di bawah fitur poligon
  2. Untuk poin di bawah setiap poligon, hapus X% dari poin berdasarkan atribut poligon

Tangkapan layar (Gambar 1) menunjukkan alat ModelBuilder saja yang disebut Iterate Feature Selection. Apa metode scripting Python yang benar untuk beralih melalui fitur dalam kelas fitur untuk meneruskan fitur ke perintah SelectLayerByLocation_management?

Gambar 2 menunjukkan output dari pilih oleh lokasi. Semua 4 lapisan adalah sama, yang akan menjadi masalah ketika saya mencoba dan menghapus poin dengan pengukuran kanopi%.

Inilah yang saya coba sejauh ini:

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...

Gambar 1 masukkan deskripsi gambar di sini

Gambar 2 masukkan deskripsi gambar di sini

Harun
sumber
2
Saya mencari kode Anda tetapi titik cepat, nama poligon Anda akan mulai pada 2; hitungan bertambah sebelum nama ditetapkan. Anda akan ingin mengatur count = 0 sebelum loop dimulai, atau meletakkan count = count + 1 (yang dapat Anda persingkat menjadi count + = 1) setelah Anda menetapkan nama fitur.
HeyOverThere

Jawaban:

10

Sebuah SearchCursor di arcpy adalah rute yang paling langsung untuk mencapai ini:

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

Perhatikan bahwa Anda dapat menggunakan properti where_clause untuk melakukan pilihan Anda.

Radar
sumber
11

Nick Ochoski benar tentang SearchCursor, tetapi ada cara yang lebih bersih untuk menggunakannya TANPA beberapa saat dan secara manual memanggil berikutnya:

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

Saya pikir Anda juga dapat menambahkan (ke trevstanhope jawaban rapi) dengan kode lebih bersih karena akan menghapus kursor secara otomatis setelah selesai

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))
Ahmed Saad
sumber
Saya telah menggunakan kursor pencarian untuk mengakses dan mendapatkan info tentang fitur, tetapi dapatkah geoprocessing dijalankan pada setiap baris, atau apakah Anda perlu menarik ID untuk baris itu dan kemudian menjalankan pemilihan dengan atribut menggunakan ID itu dan KEMUDIAN menjalankan geoprocessing Anda ?
Rex