Comment accéder à une couche de fonctionnalités dans SDE via Python?

12

J'essaie d'utiliser Arcpy pour exécuter le script CopyFeatures_management afin de pouvoir copier une couche de fonction dans SDE.

Qu'est-ce que j'utilise pour l'entrée (et la sortie, d'ailleurs, puisque je vais recopier le calque vers SDE) pour accéder au calque?

Michael Todd
la source

Réponses:

11

Vous utiliserez le chemin d'accès au fichier SDE plus le nom de la classe d'entités, donc quelque chose comme

CopyFeatures_management(r'c:\connections\my.sde\fc1', r'c:\connections\my.sde\newfc')

Jason Scheirer
la source
4
Et le «r» devant le texte fait la même chose en Python que «@» en C #, c'est-à-dire traite la chaîne comme un littéral afin que le «\» ne soit pas interprété comme des caractères de contrôle?
Michael Todd,
2
Correct. Marque la chaîne comme littérale sans caractères de contrôle.
Jason Scheirer du
16

Deux façons dont je peux penser, impliquent toutes deux d'avoir une connexion à la base de données déjà configurée dans ArcCatalog. Si le fichier de connexion à la base de données n'existe pas déjà, vous pouvez utiliser CreateArcSDEConnectionFile_management dans votre script pour le créer.

1) Définissez l'espace de travail actuel sur la connexion à la base de données, puis référez-vous à la classe d'entités par son nom.

arcpy.env.workspace = r"Database Connections\MySDEDatabaseConnection.sde"
fc = "SDE.myFeatureClass"

Si la classe d'entités se trouve dans un jeu de données d'entité, fixez le nom du jeu de données d'entité à l'espace de travail comme suit:

arcpy.env.workspace = r"Database Connections\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset"

2) Fournissez le chemin d'accès complet à la classe d'entités, y compris la connexion à la base de données:

fc = r"Database Connections\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"

Certains outils nécessitent la première méthode, d'autres la seconde.

De plus, "Connexions à la base de données" n'est en fait qu'un raccourci vers %APPDATA%\ESRI\Desktop10.0\ArcCatalog(pour ArcGIS 10 sur Windows XP). Vous pouvez tout aussi facilement fournir le chemin d'accès complet aux fichiers .sde qui sont stockés dans ce dossier ou dans d'autres dossiers.

blah238
la source
Attention dans d'autres langues, vous changerez "Connexions à la base de données" par des mots conformément à la langue de votre logiciel utilisée sur le système. Dans le mien, (parce que je suis français) la connexion est: fc = r"Connexions aux bases de données\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"
GeoStoneMarten
ok, que se passe-t-il si j'ai besoin d'utiliser la couche 1 de la base de données 1 et de l'attacher à la couche 2 qui est dans la base de données 2. comment puis-je gérer l'env.workspace s'il y a deux espaces de travail distincts?
NULL.Dude
1

Conformément à mon commentaire précédent, j'ai une autre proposition pour accéder en toute sécurité au jeu de données et à la classe de fonctionnalités.

# catalog local and arcgis version
arcgis_version = arcpy.GetInstallInfo()['Version'].split(
    ".")  # liste v_majeur,v_mineur
catalog_path = "{}\\ESRI\\Desktop{}\\ArcCatalog".format(
    os.getenv('APPDATA'), ".".join(
        arcpy.GetInstallInfo()['Version'].split(".")[:2])) # Work with Arcgis >= 10.3
conn = {}
conn["out_folder_path"] = catalog_path
conn["out_name"] = "server_x_db_user.sde"
conn["database_platform"] = "SQL_SERVER"
conn["instance"] = "server_x"
conn["account_authentication"] = "DATABASE_AUTH"
conn["database"] = "bdd"
conn["username"] = "db_user"
conn["password"] = "MydbPasS@"
conn["save_user_pass"] = "SAVE_USERNAME"

arcpy.CreateDatabaseConnection_management(**conn)
#result
# >>> <Result 'C:\\Users\\me\\AppData\\Roaming\\ESRI\\Desktop10.4\\ArcCatalog\\server_x_db_user.sde'>
desc = arcpy.Describe(os.path.join(conn["out_folder_path"],conn["out_name"]) 
# you can also pass by arcpy.Result object
arcpy.env.workspace = os.path.join(desc.path, desc.name)
#safe env for arcCatalog sde folder

print arcpy.env.workspace 
# >>> u'Connexions aux bases de donn\xe9es\\server_x_db_user.sde'

for ds in arcpy.ListDatasets(feature_type='feature') + ['']:
    for fc in arcpy.ListFeatureClasses(feature_dataset=ds):
        print fc
        # Remove empty dataset to get valid path
        path = os.path.join(
            *[v for v in [arcpy.env.workspace, ds, fc] if v])
        print path

résultat FC:

bdd.user_db.bndy_lv_municipal_sector
bdd.user_db.bndy_admin_lv_municipal
bdd.user_db.water_pg
bdd.user_db.water_pl

accès au résultat avec chemin:

Connexions aux bases de données\server_x_db_user.sde\bdd.user_db.bndy_lv_municipal_sector
Connexions aux bases de données\server_x_db_user.sde\bdd.user_db.bndy_admin_lv_municipal
Connexions aux bases de données\server_x_db_user.sde\bdd.user_db.water_pg
Connexions aux bases de données\server_x_db_user.sde\bdd.user_db.water_pl
GeoStoneMarten
la source