¿Qué es Python equivalente a la selección de características iterativas de ModelBuilder?

8

Mis datos constan de dos clases de características:

  1. Puntos = puntos que representan árboles
  2. Polígonos = Polígonos que representan el% del área del dosel por área. Cada polígono en el FC tiene una medición del% del dosel en los atributos.

Estoy tratando de lograr lo siguiente:

  1. Seleccionar puntos debajo de entidades poligonales
  2. Para los puntos debajo de cada polígono, elimine X% de los puntos en función del atributo polígono

La captura de pantalla (Figura 1) muestra una herramienta única de ModelBuilder llamada Iterate Feature Selection. ¿Cuál es el método de secuencia de comandos de Python correcto para recorrer las entidades en una clase de entidad para pasar la entidad al comando SelectLayerByLocation_management?

La Figura 2 muestra el resultado de la selección por ubicación. Las 4 capas son iguales, lo que será un problema cuando intente eliminar puntos mediante la medición del% del dosel.

Esto es lo que he intentado hasta ahora:

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

Figura 1 ingrese la descripción de la imagen aquí

Figura 2 ingrese la descripción de la imagen aquí

Aaron
fuente
2
Estoy revisando tu código, pero un punto rápido, tus nombres de polígono comenzarán en 2; el recuento se incrementa antes de establecer el nombre. Deberá establecer count = 0 antes de que comience el ciclo, o poner count = count + 1 (que puede acortar para contar + = 1) después de asignar el nombre de la función.
HeyOverThere

Respuestas:

10

Un SearchCursor en ArcPy es la ruta más directa para lograr esto:

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

Tenga en cuenta que puede usar la propiedad where_clause para realizar su selección.

Radar
fuente
11

Nick Ochoski tiene razón sobre SearchCursor, pero hay una forma más limpia de usarlo SIN un momento y llamando manualmente a continuación:

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

Creo que también puede agregar (a trevstanhope respuesta ordenada) un WITH para un código aún más limpio, ya que eliminará el cursor automáticamente después de terminar

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
fuente
He utilizado los cursores de búsqueda para acceder y obtener información sobre una función, pero ¿se puede ejecutar un geoprocesamiento en cada fila o necesita extraer la ID para esa fila y luego ejecutar una selección por atributo usando esa ID y LUEGO ejecutar su geoprocesamiento ?
Rex