Processing math: 100%

9 votos

¿Cuál es el equivalente en Python de la selección de características iterativas de ModelBuilder?

Mis datos consisten en dos capas de entidades:

  1. Puntos = puntos que representan árboles
  2. Polígonos = Polígonos que representan un % de área de dosel por área. Cada polígono en la capa de entidades tiene una medida de % de dosel en los atributos.

Estoy tratando de lograr lo siguiente:

  1. Seleccionar puntos debajo de las características de los polígonos
  2. Para los puntos bajo cada polígono, eliminar un X% de los puntos basado en el atributo del polígono

La captura de pantalla (Figura 1) muestra una herramienta solo de ModelBuilder llamada Iterar Selección de Características. ¿Cuál es el método de script de Python correcto para iterar a través de las características en una capa de entidades para pasar la característica a la comando SelectLayerByLocation_management?

La Figura 2 muestra la salida de la selección por ubicación. Todas las 4 capas son iguales, lo cual será un problema cuando intente eliminar puntos por la medida de % de 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

# Los polígonos tienen datos de % de dosel en los atributos
polígonos = r'C:\temp_model_data\CanopyPercentages.shp'
puntos = r'C:\temp_model_data/points_20_2012.shp'

if arcpy.Exists("pointsLayer"):
    print "pointsLayer ya existe"
else:
    arcpy.MakeFeatureLayer_management (puntos, "pointsLayer")
    print "pointsLayer creada"

count = 1

#Crear un cursor de búsqueda para avanzar a través de las características de los polígonos
polígonos = arcpy.da.SearchCursor(polígonos, ["OID@", "SHAPE@"])

for polígono in polígonos:

    # Crear un nombre para las características de los polígonos
    count = count + 1
    nombreDeCaracterística = "polígono_" + str(count)
    print nombreDeCaracterística

    # Seleccionar puntos que están bajo los polígonos
    arcpy.SelectLayerByLocation_management('pointsLayer', 'intersecar', polígonos)
    arcpy.SaveToLayerFile_management('pointsLayer', outWorkspace + nombreDeCaracterística + ".lyr", "ABSOLUTE")

    # Agregar aquí el script de selección aleatoria de puntos...

    # Eliminar puntos seleccionados dentro de cada polígono basado en el % de cobertura de dosel...

Figura 1 introducir descripción de la imagen aquí

Figura 2 introducir descripción de la imagen aquí

2 votos

Estoy revisando tu código pero un detalle rápido, tus nombres de polígonos van a empezar en 2; el conteo se incrementa antes de que se establezca el nombre. O bien querrás establecer count = 0 antes de que empiece el bucle, o poner count = count + 1 (lo cual puedes abreviar a count += 1) después de asignar el nombre de la característica.

12voto

plaureano Puntos 1105

Nick Ochoski tiene razón acerca del SearchCursor, pero hay una manera más limpia de usarlo SIN un while y llamando manualmente a next:

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

11voto

Markus Olsson Puntos 12651

Un SearchCursor en arcpy es la manera más directa de 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 utilizar la propiedad where_clause para realizar su selección.

9voto

Ahmed Saad Puntos 153

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

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X