Suite

Débogage de l'ERREUR 000725 à partir de la boucle à l'aide de SearchCursor, SelectLayerByAttribute et CopyFeatures ?

Débogage de l'ERREUR 000725 à partir de la boucle à l'aide de SearchCursor, SelectLayerByAttribute et CopyFeatures ?


Je suis assez nouveau dans les scripts python pour ArcGIS. J'essaie de créer des cartes où chaque comté est sélectionné, puis copié dans une nouvelle couche avec uniquement les données de ce comté. Ensuite, j'ai utilisé ApplySymbologyFrom pour copier le format de symbologie à partir d'une couche fictive. Cela a fonctionné lorsque j'ai exécuté le code pour un comté individuel, mais cela ne fonctionne pas lorsque j'essaie de l'utiliser dans une instruction de boucle.

Détails de l'erreur : le code semble fonctionner jusqu'à l'étape de la boucle. Les variables sont stockées, l'espace de travail d'environnement est défini et la carte actuelle est référencée. La variable curseur est stockée. Lorsque j'essaie d'exécuter le bloc de code "pour la ligne dans le curseur" et que j'appuie deux fois sur Entrée, le programme n'a aucune réponse à part une nouvelle ligne >>>. Il n'y a pas de code d'erreur produit lorsque j'exécute ce bloc de code.

Message d'erreur de l'exécution de PythonWin : ExecuteError : échec de l'exécution. Les paramètres ne sont pas valides. ERREUR 000725 : Classe d'entités en sortie : le jeu de données T:HCIShapefilesInset_MapsAlameda.shp existe déjà. Échec de l'exécution (CopyFeatures).

MISE À JOUR : j'ai ajouté le code pour supprimer les données précédentes. Maintenant, le nouveau message d'erreur est "NameError : le nom 'row' n'est pas défini"

Voici mon code pour l'instant :

# Importer les modules système import arcpy # Définir l'espace de travail arcpy.env.workspace = r"T:HCIShapefilesInset_Maps" #mxd = arcpy.mapping.MapDocument("CURRENT") mxd = arcpy.mapping.MapDocument("C: Usersjchan1DesktopInset_maps_test.mxd") #le traitement de l'arrière-plan a été désactivé dans les options de géotraitement afin d'accéder à la carte actuelle #écrasement de la sortie du géotraitement activé dans les options de géotraitement #créer des variables locales field = "NAME_1" counties = "Counties_layer" #remove délimiteurs de champ, si nécessaire arcpy.AddFieldDelimiters(counties,field) cursor = arcpy.SearchCursor(counties) pour la ligne dans le curseur : whereClause = '"NAME_1" = "+ row.getValue(field) + "'" si arcpy.Exists (row.getValue(field)): arcpy.Delete_management(row.getValue(field)) # Sélectionner une couche par nom de comté arcpy.SelectLayerByAttribute_management(counties,"NEW_SELECTION",whereClause) # Écrire les entités sélectionnées dans une nouvelle classe d'entités arcpy.CopyFeatures_management (counties, row.getValue(field)) # Copier la symbologie de la couche de comté à partir de l'échantillon de couche arcpy.ApplySymbologyFromLayer_management(row.getValue(field), "dummy") # exporte l'image incrustée au format JPEG # arcpy.mapping.ExporttoPJEG(mxd,r"file_path_name") # supprime les variables locales del row, cursor, mxd #Refresh screen arcpy. RefreshTOC() arcpy.RefreshActiveView()

Si vous l'exécutez dans la fenêtre Python, vous devez accéder au menu Géotraitement -> Options de géotraitement et vérifier le paramètre "Ecraser les sorties des opérations de géotraitement". Si elle n'est pas cochée, le script se comporte correctement, car votre paramètre actuel n'est pas censé ne pas laisser les outils écraser les sorties. Une fois ce paramètre vérifié, les sorties doivent être écrasées si vous exécutez vos outils dans ArcMap et votre script doit réussir.

Cependant, pour un script autonome exécuté en dehors d'ArcMap, l'option de géotraitement ne s'applique pas. Vous devez ajouter du code pour vérifier si une classe d'entités existe déjà et la supprimer avant d'essayer d'utiliser Copy_Features pour la recréer. Cette approche fonctionne toujours, que vous soyez ou non dans ArcMap et même si l'option Écraser n'est pas cochée pendant que vous travaillez dans ArcMap, j'utilise donc toujours cette méthode. Utilisez un code comme :

if arcpy.Exists(row.getValue(field)): arcpy.Delete_management(row.getValue(field)) # les données sont supprimées, vous pouvez donc maintenant réutiliser ce nom pour de nouvelles données

Si ce code sera utilisé dans un outil de script dans ArcMap et s'adresse aux utilisateurs finaux qui devraient recevoir des avertissements factices s'ils essaient d'écraser des données existantes avec des outils de géotraitement autres que votre outil, vous ne voulez pas modifier de façon permanente le paramètre d'écrasement dans votre script. sans le remettre à l'état d'écrasement précédent lorsque le script réussit à recréer les données. Dans ce cas, demandez au script de lire d'abord son paramètre d'écrasement existant et de le stocker dans une variable, puis d'activer temporairement l'écrasement, puis de réinitialiser l'écrasement sur le paramètre d'origine de l'utilisateur lorsque vous avez terminé d'écraser les données. Quelque chose comme:

from arcpy import env origSetting = env.overwriteOutput env.overwriteOutput = True # Est-ce que certaines données écrasent env.overwriteOutput = origSetting

Voir la vidéo: Le débogueur JavaScript VSCode, Google Chrome M0L09