¿Cómo se accede a una capa de características en SDE a través de Python?

12

Estoy tratando de usar Arcpy para ejecutar el script CopyFeatures_management para poder copiar una capa de características en SDE.

¿Qué uso para la entrada (y la salida, para el caso, ya que volveré a copiar la capa a SDE) para acceder a la capa?

Michael Todd
fuente

Respuestas:

11

Utilizará la ruta al archivo SDE más el nombre de la clase de entidad, de modo que

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

Jason Scheirer
fuente
44
¿Y la 'r' delante del texto hace lo mismo en Python que '@' en C #, es decir, trata la cadena como un literal para que la '\' no se malinterprete como caracteres de control?
Michael Todd
2
Correcto. Marca la cadena como literal sin caracteres de control.
Jason Scheirer
16

Dos formas en las que puedo pensar, ambas implican tener una conexión de base de datos ya configurada en ArcCatalog. Si el archivo de conexión de la base de datos aún no existe, puede usar CreateArcSDEConnectionFile_management en su script para crearlo.

1) Establezca el espacio de trabajo actual para la conexión de la base de datos y luego consulte la clase de entidad por su nombre.

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

Si la clase de entidad está en un conjunto de datos de entidad, agregue el nombre del conjunto de datos de entidad al espacio de trabajo de la siguiente manera:

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

2) Proporcione la ruta completa a la clase de entidad, incluida la conexión de la base de datos:

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

Algunas herramientas requieren el primer método, otras requieren el segundo.

Además, "Conexiones de base de datos" es en realidad solo un acceso directo a %APPDATA%\ESRI\Desktop10.0\ArcCatalog(para ArcGIS 10 en Windows XP). Puede proporcionar fácilmente la ruta completa a los archivos .sde que están almacenados en esa carpeta u otras carpetas.

blah238
fuente
Advertencia en otros idiomas que cambiará "Conexiones de base de datos" por palabras de acuerdo con el idioma de su software utilizado en el sistema. En el mío, (porque soy francés) la conexión es: fc = r"Connexions aux bases de données\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"
GeoStoneMarten
ok, ¿qué pasa si necesito usar la capa 1 de la base de datos 1 y recortarla a la capa 2 que está en la base de datos 2. ¿cómo manejo el espacio de trabajo env.si hay dos espacios de trabajo separados?
NULL.Dude
1

De acuerdo con mi comentario anterior , tengo otra propuesta para acceder de forma segura para presentar el conjunto de datos y la clase de características

# 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

resultado 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

resultado de acceso con ruta:

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
fuente