Was entspricht Python der Iterate Feature Selection von ModelBuilder?

8

Meine Daten bestehen aus zwei Feature-Classes:

  1. Punkte = Punkte, die Bäume darstellen
  2. Polygone = Polygone, die% Baldachin Fläche für Fläche darstellen. Jedes Polygon in der FC hat eine prozentuale Überdachungsmessung in den Attributen.

Ich versuche Folgendes zu erreichen:

  1. Wählen Sie Punkte unter Polygon-Features aus
  2. Löschen Sie für die Punkte unter jedem Polygon X% der Punkte basierend auf dem Polygonattribut

Der Screenshot (Abbildung 1) zeigt ein Nur-ModelBuilder-Tool namens Iterate Feature Selection. Was ist die richtige Python-Skriptmethode, um Features in einer Feature-Class zu durchlaufen, um das Feature an den Befehl SelectLayerByLocation_management weiterzugeben?

Abbildung 2 zeigt die Ausgabe der Auswahl nach Standort. Alle 4 Ebenen sind gleich, was ein Problem darstellt, wenn ich versuche, Punkte durch die Messung des Baldachins in% zu löschen.

Folgendes habe ich bisher versucht:

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

Abbildung 1 Geben Sie hier die Bildbeschreibung ein

Figur 2 Geben Sie hier die Bildbeschreibung ein

Aaron
quelle
2
Ich sehe mir Ihren Code an, aber kurz gesagt, Ihre Polygonnamen beginnen bei 2; Die Anzahl wird erhöht, bevor der Name festgelegt wird. Sie möchten entweder count = 0 setzen, bevor die Schleife beginnt, oder count = count + 1 (die Sie auf count + = 1 verkürzen können) setzen, nachdem Sie den Feature-Namen zugewiesen haben.
HeyOverThere

Antworten:

10

Ein SearchCursor in arcpy ist der direkteste Weg, um dies zu erreichen:

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

Beachten Sie, dass Sie die where_clause- Eigenschaft verwenden können, um Ihre Auswahl durchzuführen.

Radar
quelle
11

Nick Ochoski hat Recht mit dem SearchCursor, aber es gibt eine sauberere Möglichkeit, ihn OHNE eine Weile zu verwenden und als nächstes manuell aufzurufen:

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

Ich denke, Sie können auch ein WITH für noch saubereren Code hinzufügen (um eine saubere Antwort zu erhalten), da der Cursor nach Abschluss automatisch gelöscht wird

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
quelle
Ich habe Suchcursor verwendet, um auf eine Funktion zuzugreifen und Informationen zu dieser Funktion abzurufen. Kann jedoch für jede Zeile eine Geoverarbeitung ausgeführt werden, oder müssen Sie die ID für diese Zeile abrufen und dann ein Attribut select by mit dieser ID ausführen und dann Ihre Geoverarbeitung ausführen ?
Rex