O que é equivalente ao Python da seleção de recursos de iteração do ModelBuilder?

8

Meus dados consistem em duas classes de recursos:

  1. Pontos = pontos representando árvores
  2. Polígonos = polígonos que representam% da área do dossel por área. Cada polígono no FC tem uma medida de% dossel nos atributos.

Estou tentando fazer o seguinte:

  1. Selecionar pontos abaixo dos recursos de polígono
  2. Para os pontos em cada polígono, exclua X% dos pontos com base no atributo de polígono

A captura de tela (Figura 1) mostra uma única ferramenta ModelBuilder chamada Iterate Feature Selection. Qual é o método de script Python correto para iterar os recursos em uma classe de recurso, a fim de passar o recurso ao comando SelectLayerByLocation_management?

A Figura 2 mostra a saída do selecionar por local. Todas as 4 camadas são iguais, o que será um problema quando eu tentar excluir pontos pela medição da porcentagem do dossel.

Isto é o que eu tentei até agora:

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 insira a descrição da imagem aqui

Figura 2 insira a descrição da imagem aqui

Aaron
fonte
2
Estou examinando seu código, mas um ponto rápido: seus nomes de polígono começarão às 2; a contagem é incrementada antes do nome ser definido. Você deseja definir count = 0 antes do início do loop ou colocar count = count + 1 (que pode ser reduzido para contar + = 1) depois de atribuir o nome do recurso.
precisa saber é o seguinte

Respostas:

10

Um SearchCursor no arcpy é a rota mais direta para fazer isso:

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

Observe que você pode usar a propriedade where_clause para executar sua seleção.

Radar
fonte
11

Nick Ochoski está certo sobre o SearchCursor, mas há uma maneira mais limpa de usá-lo SEM UM TEMPO e ligando manualmente a seguir:

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

Eu acho que você também pode adicionar (para trevstanhope resposta pura) um WITH para um código ainda mais limpo, pois excluirá o cursor automaticamente após o término

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
fonte
Eu usei cursores de pesquisa para acessar e obter informações sobre um recurso, mas um geoprocessamento pode ser executado em cada linha ou você precisa extrair o ID para essa linha e executar um select por atributo usando esse ID e depois executar seu geoprocessamento ?
Rex