Suite

Arcpy; Sélectionner par attribut avec une instruction If, then


Comment construire une instruction if, then basée sur une requête SQL de sélection par attribut ou une autre méthode (curseur de recherche ?) ?

Je demande aux utilisateurs de saisir un identifiant unique (arcpy.GetParameterAsText(0)), basé sur cet identifiant, je veux rechercher un champ de fichier de formes pour cette valeur (arcpy.SelectLayerByAttribute_management ou arcpy.SearchCursor?), s'il n'est pas trouvé, je voulez rechercher un fichier de formes différent. Lorsque l'ID unique est trouvé, je dois exporter (arcpy.CopyFeatures_management) et isoler la fonctionnalité.

J'ai du mal à essayer de trouver quelque chose qui indiquera si l'ID unique est trouvé dans le champ ou non.

Je recherche essentiellement quelque chose comme ce qui se passe avec l'événement du bouton Vérifier l'expression, cliquez sur -> "L'expression a été vérifiée avec succès, MAIS AUCUN ENREGISTREMENT N'A ÉTÉ RETOURNÉ".


Supposons que vous ayez une liste de fichiers de formes et que le nom de champ de l'attribut est le même dans chaque fichier de formes. Cela signifie que vous pouvez faire la requête SQL au début du script, donc le premier bit pourrait ressembler à ceci :

search_id = arcpy.GetParameterAsText(0) shps = [r"cheminversshp1.shp",r"cheminversshp2.shp"] output_shp = r"cheminversoutput.shp" field = "ID_FIELD_NAME" sql = '"{0}" = '{1}".format(field,search_id)

Voici deux façons de procéder pour votre processus de sélection. Le premier utilise une clause where dans MakeFeatureLayer() et GetCount(), et le second utilise un SearchCursor() pour trouver l'attribut et passe à MakeFeatureLayer(). Je ne sais pas lequel est le plus rapide, mais je suppose que c'est le second. Très probablement, la vitesse est très similaire si vous n'avez pas des tonnes de fichiers de formes.

pour shp dans shps : # créer une couche de fonctionnalités si arcpy.Exists("fl") : arcpy.management.Delete("fl") fl = arcpy.management.MakeFeatureLayer(shp,"fl",sql) # vérifier le nombre de fonctionnalités dans la nouvelle couche d'entités, passez au shp suivant s'il == 0 if int(arcpy.management.GetCount(fl).getOutput(0)) == 0: continue # copier les entités, ne se produit que s'il y a une entité dans l'entité couche arcpy.management.CopyFeatures(fl,output_shp)

et voici le deuxième. Dans celui-ci, un SearchCursor est utilisé pour vérifier la présence de la fonctionnalité, puis le MakeFeatureLayer() est utilisé. Je pense que ce serait probablement le moyen le plus rapide:

pour shp dans shps : # utilisez la compréhension de la liste avec un SearchCursor pour vérifier l'id all_ids = [r[0] for r in arcpy.da.SearchCursor(shp,field)] sinon search_id dans all_ids : continue # maintenant créer une couche d'entités et copier les fonctionnalités si arcpy.Exists("fl") : arcpy.management.Delete("fl") fl = arcpy.management.MakeFeatureLayer(shp,"fl",sql) # copier les fonctionnalités arcpy.management.CopyFeatures(fl, sortie_shp)

ÉDITER:

Avec des noms de champs différents, vous pouvez les stocker et itérer les fichiers de formes comme ceci :

shps = [(r"cheminversshp1.shp","ID_FIELD_NAME1"), (r"cheminversshp2.shp","ID_FIELD_NAME2")] output_shp = r"cheminverssortie.shp" pour élément dans shps : shp = item[0] field = item[1] sql = '"{0}" = '{1}".format(field,search_id) #continuez avec le reste du code comme ci-dessus


Voir la vidéo: How to Select Features by Attributes in ArcMap Tutorial (Octobre 2021).