Quel est l'équivalent Python de la sélection des fonctionnalités itératives de ModelBuilder?


8

Mes données se composent de deux classes de fonctionnalités:

  1. Points = points représentant des arbres
  2. Polygones = Polygones représentant le% de la surface du couvert par zone. Chaque polygone dans le FC a une mesure de% de canopée dans les attributs.

J'essaie d'accomplir ce qui suit:

  1. Sélectionner des points sous les entités surfaciques
  2. Pour les points sous chaque polygone, supprimez X% des points en fonction de l'attribut polygone

La capture d'écran (Figure 1) montre uniquement un outil ModelBuilder appelé Itérer la sélection des fonctionnalités. Quelle est la méthode de script Python correcte pour parcourir les fonctionnalités d'une classe d'entités afin de transmettre la fonctionnalité à la commande SelectLayerByLocation_management?

La figure 2 montre la sortie de la sélection par emplacement. Les 4 couches sont identiques, ce qui sera un problème lorsque j'essaierai de supprimer des points par la mesure du% de la verrière.

Voici ce que j'ai essayé jusqu'à présent:

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

Figure 1 entrez la description de l'image ici

Figure 2 entrez la description de l'image ici


2
Je regarde votre code mais un petit point, vos noms de polygones vont commencer à 2; le nombre est incrémenté avant que le nom ne soit défini. Vous devrez soit définir count = 0 avant le début de la boucle, soit mettre count = count + 1 (que vous pouvez raccourcir pour compter + = 1) après avoir attribué le nom de la fonction.
HeyOverThere

Réponses:


10

Un SearchCursor dans arcpy est la voie la plus directe pour y parvenir:

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

Notez que vous pouvez utiliser la propriété where_clause pour effectuer votre sélection.


11

Nick Ochoski a raison à propos du SearchCursor, mais il existe un moyen plus propre de l'utiliser SANS temps et d'appeler manuellement ensuite:

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

9

Je pense que vous pouvez également ajouter (à une réponse nette trevstanhope) un AVEC pour un code encore plus propre car il supprimera automatiquement le curseur après la fin

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

J'ai utilisé des curseurs de recherche pour accéder à une fonctionnalité et obtenir des informations sur celle-ci, mais un géotraitement peut-il être exécuté sur chaque ligne, ou devez-vous extraire l'ID de cette ligne, puis exécuter une sélection par attribut à l'aide de cet ID et ALORS exécuter votre géotraitement ?
Rex
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.