Suite

Utiliser correctement arcpy.da.Editor ?

Utiliser correctement arcpy.da.Editor ?


J'essaie de supprimer les doublons dans une classe d'entités générés par un script Python. A la fin de mon script j'ai le bloc de code ci-dessous ; Je ne l'ai pas encore implémenté, mais j'aimerais voir si c'est la bonne façon d'utiliser arcpy.da.Editor car les erreurs que j'ai reçues concernent le fait d'être en dehors d'une session d'édition.

Arcpy.da.Editor est-il utilisé correctement ici ?

'

champs = ['OBJECTID', 'SRNumber', 'ItemLoc_9'] table_rows = [] delete_rows = [] where_clause = """ ItemLoc_9 ="""" avec arcpy.da.Editor(appendClass) comme édition : avec arcpy.da .SearchCursor(appendClass, fields, where_clause) comme curseur : pour la ligne dans le curseur : if [row[1], row[2]] dans table_rows : delete_rows.append(row[0]) else : table_rows.append([row[ 1], row[2]]) del table_rows avec arcpy.da.UpdateCursor(appendClass, ['OBJECTID']) comme curseur2 : pour la ligne dans le curseur2 : si la ligne[0] dans delete_rows : print 'Suppression de l'enregistrement : OBJECTID = ' + str(row[0]) cursor2.deleteRow() print '
done"

Je me souviens avoir eu un problème avec l'éditeur dans l'instruction with, mais je ne l'ai pas essayé depuis un moment.

Vous pouvez essayer ce format à la place :

edit = arcpy.da.Editor(workspace) edit.startEditing(False, True) edit.startOperation() ##CODE edit.stopOperation() edit.stopEditing(True)

J'ai regardé un ancien script, et c'est le format que j'ai utilisé.


J'ai eu beaucoup de problèmes/incohérences avec cela dans le passé. Au lieu de cela, j'ai implémenté des wrappers pour les curseurs de mise à jour et d'insertion. De cette façon, chaque fois que j'exécute un curseur de mise à jour, je sais qu'une session d'édition est correctement démarrée et arrêtée pour le curseur. Voici mon curseur de mise à jour (avec une fonction d'aide pour obtenir l'espace de travail):

import arcpy import os def find_ws(path, ws_type="): """ trouve un chemin d'espace de travail valide pour une session arcpy.da.Editor() Obligatoire : chemin -- chemin vers les fonctionnalités ou l'espace de travail Facultatif : ws_type -- option à rechercher type d'espace de travail spécifique (FileSystem|LocalDatabase|RemoteDatabase) """ # essayez d'abord le chemin d'origine si os.sep n'est pas dans le chemin : chemin = arcpy.Describe(path).catalogPath desc = arcpy.Describe(path) if hasattr(desc, ' workspaceType'): if ws_type et ws_type == desc.workspaceType: chemin de retour elif not ws_type: chemin de retour # recherche jusqu'à trouver un espace de travail valide SPLIT = filter(None, path.split(os.sep)) if path.startswith(' '): SPLIT[0] = r'{0}'.format(SPLIT[0]) # trouver un espace de travail valide pour i dans xrange(1, len(SPLIT)): sub_dir = os.sep .join(SPLIT[:-i]) desc = arcpy.Describe(sub_dir) if hasattr(desc, 'workspaceType'): if ws_type and ws_type == desc.workspaceType: return sub_dir elif not ws_type: return sub_dir class UpdateCursor(object ): """ classe wrapper pour arcpy.da.UpdateCursor, pour imp automatiquement édition des éléments (requise pour les données versionnées et les données avec des réseaux géométriques, des topologies, des jeux de données réseau et des classes de relations""" def __init__(self, *args, **kwargs): """ initie la classe wrapper pour le curseur de mise à jour. Arguments pris en charge : in_table, field_names, where_clause=None, spatial_reference=None, elastic_to_points=False, sql_clause=(None, None) """ self.args = args self.kwargs = kwargs self.edit = None def __enter__(self) : ws = Aucun si self.args : ws = find_ws(self.args[0]) elif 'in_table' dans self.kwargs : ws = find_ws(self.kwargs['in_table']) self.edit = arcpy.da.Editor (ws) self.edit.startEditing() self.edit.startOperation() return arcpy.da.UpdateCursor(*self.args, **self.kwargs) def __exit__(self, type, value, traceback): self.edit .stopOperation() self.edit.stopEditing(True) self.edit = Aucun

Donc, si vous enregistrez cela quelque part dans votre PYTHONPATH et appelez le curseur de mise à jour, vous pouvez toujours être sûr qu'une session d'édition est démarrée et arrêtée. Ce wrapper permet également l'utilisation de l'instruction with pour le curseur.

Si vous avez enregistré le script ci-dessus sousun_module.pyet enregistrez-le dans votre PYTHONPATH, vous pouvez l'appeler comme ceci :

import some_module fc = r'C:Path	o_yourFileGeodatabaseYourFC' fields = ["field1", "field2"] with some_module.UpdateCursor(fc, fields) as rows: for row in rows: row[1] = ligne[0] lignes.updateRow(ligne)

Cela fonctionnera sur une classe d'entités de base de données versionnée :

edit = arcpy.da.Editor(workspace) # La session d'édition est démarrée sans pile d'annulation/rétablissement pour les données versionnées # (pour le deuxième argument, utilisez False pour les données non versionnées) edit.startEditing(False, True) # Créer un curseur de mise à jour avec arcpy .da.UpdateCursor("Vos paramètres") en tant que curseur : # Démarrez une opération d'édition edit.startOperation() pour la ligne du curseur : # Votre code # Arrêtez l'opération d'édition. edit.stopOperation() # Arrête la session d'édition et enregistre les modifications edit.stopEditing(True)

Voir la vidéo: Python et ArcMap Cours 1: Automatisation des geoprocess avec arcpy