Suite

Arcpy Copier des classes d'entités avec écrasement dans des jeux de classes d'entités spécifiques


Objectif - J'ai un "schéma" GDB cible avec des noms de jeux de données d'entités et des classes d'entités (pas d'entités) à l'intérieur. Je souhaite copier les classes d'entités de géodatabase de soumission dans cette cible. Je reprojette d'abord la cible pour qu'elle corresponde au système de coordonnées de soumission.

Ce que je veux faire avec python, c'est copier toutes les classes d'entités de la soumission vers la cible, où si un nom de classe d'entités de soumission correspond à un dans la GDB cible, je veux la remplacer dans la GDB cible dans l'emplacement du jeu de données d'entités où le la classe d'entités vide était dans la cible. Si la classe d'entités de soumission n'a pas de correspondance de nom dans la GDB cible, je souhaite la copier dans la GDB cible en dehors de tout jeu de données d'entité.

Je suis novice en python. J'ai utilisé http://support.esri.com/en/knowledgebase/techarticles/detail/40831 pour commencer et j'ai maintenant le code (ci-dessous) pour travailler pour copier toutes les classes d'entités de la GDB source vers la GDB cible, en supprimant la fonctionnalité classes dans les jeux de classes d'entités avec des noms correspondants entre les GDB source et cible, mais je n'arrive pas à le faire placer les classes d'entités sources dans les jeux de classes d'entités où les classes d'entités de nom correspondant se trouvent dans la cible, cela les met simplement dans aucun jeu de données d'entité dans le GDB.

METTRE À JOUR: Le code fonctionne lorsque je fais une copie de ma base de données de soumission. Cela a révélé que le code ne fonctionnait pas comme prévu, car le reprojet que je fais sur mes jeux de données d'entités de base de données cible initialement n'apporte pas vraiment toutes les informations de référence spatiale. Pour que cela fonctionne comme je le souhaite, je pense que je dois ajouter du code pour créer de nouveaux jeux de données d'entités dans la GDB cible avec les mêmes noms que les jeux de données d'entités cibles avec des informations de référence spatiale à partir des jeux de données d'entités soumis, puis copier l'entité classes où les noms de soumission de noms correspondent aux noms de cible, puis supprimez les jeux de données d'entité cible d'origine (ou écrasez lors de la création).

Extrait de code ci-dessous mis à jour par instruction de commentaire :

import arcpy, os, string arcpy.env.overwriteOutput = True def FeatureClassToFeatureClass_conversion(start_db,end_db): #Set workspaces arcpy.env.workspace = start_db wk2 = end_db datasetList = arcpy.ListDatasets() #for classes d'entités dans les ensembles de données pour l'ensemble de données dans datasetList : fclist = arcpy.ListFeatureClasses("*","",dataset) pour fc dans fclist : print "Lecture : {0}".format(fc) name = arcpy.Describe(fc) new_data=name.name if arcpy .Exists(wk2 + os.sep + new_data)==True : arcpy.Delete_management(wk2 + os.sep + new_data) arcpy.Copy_management(fc, wk2 + os.sep + new_data) print "Copie terminée le {0}" .format(new_data) else : arcpy.Copy_management(fc, wk2 + os.sep + new_data) print "Copie terminée sur {0}".format(new_data) #Effacer la mémoire del fc if __name__== "__main__": start_db = arcpy.GetParameterAsText(0) end_db = arcpy.GetParameterAsText(1) FeatureClassToFeatureClass_conversion(start_db,end_db)

s'il y a une correspondance de nom dans votre base de données cible, il devrait être plus facile et plus rapide de

  • purger la classe d'entités cible (supprimer les objets, pas la classe elle-même)

  • définir sa projection pour qu'elle corresponde à celle de la classe d'entités soumise. Deux grandes hypothèses ici : la classe d'entité cible n'est PAS dans un jeu de données d'entité ET la structure de la table attributaire est identique. Cela dépend donc de votre flux de travail.

  • ajouter les enregistrements de la classe d'entités de soumission.

Sinon, pour vos problèmes de projection, vous pouvez essayer de définir les variables d'environnement

arcpy.env.outputCoordinateSystem

et, si nécessaire :

arcpy.env.geographicTransformations

Enfin, il me semble que votre déclaration

sem2 + os.sep + nouvelles_données

référence la base de données cible et le nom de la classe d'entités, c'est pourquoi vous créez des classes d'entités autonomes. Vous devez y inclure explicitement le nom de l'ensemble de données cible, quelque chose du genre :

wk2 + os.sep + ensemble de données + os.sep + new_data


Voir la vidéo: GIS Python: Count shape files and Select by Location 2 Real world ArcPy examples (Octobre 2021).