Wie greift man in SDE über Python auf einen Featurelayer zu?

12

Ich versuche, Arcpy zum Ausführen des Skripts "CopyFeatures_management" zu verwenden, damit ich einen Featurelayer in SDE kopieren kann.

Was verwende ich für die Eingabe (und die Ausgabe, da ich die Ebene zurück in SDE kopieren werde), um auf die Ebene zuzugreifen?

Michael Todd
quelle

Antworten:

11

Sie verwenden den Pfad zur SDE-Datei sowie den Namen der Feature-Class, also so etwas wie

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

Jason Scheirer
quelle
4
Und das 'r' vor dem Text macht in Python dasselbe wie '@' in C #, dh behandelt den String als Literal, damit das '\' nicht als Steuerzeichen missverstanden wird?
Michael Todd
2
Richtig. Markiert die Zeichenfolge als Literal ohne Steuerzeichen.
Jason Scheirer
16

Zwei Möglichkeiten, die ich mir vorstellen kann: Bei beiden muss eine Datenbankverbindung bereits in ArcCatalog eingerichtet sein. Wenn die Datenbankverbindungsdatei noch nicht vorhanden ist, können Sie sie mit CreateArcSDEConnectionFile_management in Ihrem Skript erstellen.

1) Stellen Sie den aktuellen Arbeitsbereich auf die Datenbankverbindung ein und beziehen Sie sich dann nach Namen auf die Feature-Class.

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

Wenn sich die Feature-Class in einem Feature-Dataset befindet, heften Sie den Namen des Feature-Datasets wie folgt an den Arbeitsbereich:

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

2) Geben Sie den vollständigen Pfad zur Feature-Class einschließlich der Datenbankverbindung an:

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

Einige Tools erfordern die erste Methode, andere die zweite.

"Datenbankverbindungen" ist eigentlich nur eine Verknüpfung zu %APPDATA%\ESRI\Desktop10.0\ArcCatalog(für ArcGIS 10 unter Windows XP). Genauso einfach können Sie den vollständigen Pfad zu .sde-Dateien angeben, die in diesem Ordner oder in anderen Ordnern gespeichert sind.

blah238
quelle
Warnung In anderen Sprachen ändern Sie "Datenbankverbindungen" wortweise entsprechend Ihrer auf dem System verwendeten Softwaresprache. In meinem (weil ich fc = r"Connexions aux bases de données\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"
Franzose
OK, was ist, wenn ich Layer 1 aus Datenbank 1 verwenden und auf Layer 2 aus Datenbank 2 ausschneiden muss? Wie gehe ich mit dem env.workspace um, wenn zwei separate Arbeitsbereiche vorhanden sind?
NULL.Dude
1

In Übereinstimmung mit meinem vorherigen Kommentar habe ich einen anderen Vorschlag, sicher auf Feature-Dataset und Feature-Class zuzugreifen

# 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

Ergebnis 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

Ergebniszugriff mit Pfad:

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
quelle