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?

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')


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.