Como alguém acessa um featurelayer no SDE via Python?

12

Estou tentando usar o Arcpy para executar o script CopyFeatures_management, para que eu possa copiar uma camada de característica no SDE.

O que eu uso para a entrada (e a saída, nesse caso, já que copiarei a camada para o SDE) para acessar a camada?

Michael Todd
fonte

Respostas:

11

Você usará o caminho para o arquivo SDE mais o nome da classe do recurso, portanto, algo como

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

Jason Scheirer
fonte
4
E o 'r' na frente do texto faz a mesma coisa em Python que '@' em C #, ou seja, trata a string como um literal para que o '\' não seja interpretado como caracteres de controle?
Michael Todd
2
Corrigir. Marca a string como literal sem caracteres de controle.
Jason Scheirer
16

Duas maneiras em que posso pensar, ambas envolvem ter uma Conexão com o Banco de Dados já configurada no ArcCatalog. Se o arquivo de Conexão com o Banco de Dados ainda não existir, você poderá usar o CreateArcSDEConnectionFile_management em seu script para criá-lo.

1) Defina a área de trabalho atual como a conexão com o banco de dados e, em seguida, consulte a classe de recurso por nome.

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

Se a classe de recurso estiver em um conjunto de dados de recursos, inclua o nome do conjunto de dados de recursos no espaço de trabalho da seguinte maneira:

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

2) Forneça o caminho completo para a classe de recurso, incluindo a conexão com o banco de dados:

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

Algumas ferramentas requerem o primeiro método, outras exigem o segundo.

Além disso, "Conexões de banco de dados" é na verdade apenas um atalho para %APPDATA%\ESRI\Desktop10.0\ArcCatalog(para ArcGIS 10 no Windows XP). Você também pode fornecer com facilidade o caminho completo para os arquivos .sde armazenados nessa pasta ou em outras pastas.

blah238
fonte
Aviso em outros idiomas, você alterará "Conexões do banco de dados" por palavras, de acordo com o idioma do software usado no sistema. Na minha (porque eu sou francês) a conexão é: fc = r"Connexions aux bases de données\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"
GeoStoneMarten 10/17/17
ok, e se eu precisar usar a camada 1 do banco de dados 1 e prendê-la na camada 2 que está no banco de dados 2. como lidar com o env.workspace se houver dois espaços de trabalho separados?
NULL.Dude
1

De acordo com meu comentário anterior , tenho outra proposta para acessar com segurança o recurso de conjunto de dados e classe de recurso

# 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

acesso ao resultado com o caminho:

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
fonte