如何通过Python访问SDE中的要素图层?


12

我正在尝试使用Arcpy运行CopyFeatures_management脚本,以便可以在SDE中复制要素图层。

我将使用什么输入(访问输出,因为将层复制回SDE)来访问该层?

Answers:


11

您将使用SDE文件的路径以及要素类名称,因此类似

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


4
并且文本前面的“ r”在Python中与C#中的“ @”具有相同的作用,即将字符串视为文字,因此不会将“ \”误认为控制字符吗?
Michael Todd

2
正确。将字符串标记为不带控制字符的文字。
Jason Scheirer 2011年

16

我可以想到的两种方法都涉及在ArcCatalog中已经建立数据库连接。如果数据库连接文件尚不存在,则可以在脚本中使用CreateArcSDEConnectionFile_management创建它。

1)将当前工作空间设置为数据库连接,然后按名称引用要素类。

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

如果要素类在要素数据集中,则将要素数据集名称添加到工作空间,如下所示:

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

2)提供要素类的完整路径,包括数据库连接:

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

一些工具需要第一种方法,而其他工具则需要第二种方法。

另外,“数据库连接”实际上只是%APPDATA%\ESRI\Desktop10.0\ArcCatalog(对于Windows XP上的ArcGIS 10)的快捷方式。您可以轻松地提供该文件夹或其他文件夹中存储的.sde文件的完整路径。


警告以其他语言,您将根据系统上使用的软件语言通过单词更改“数据库连接”。在我的网站上,(因为我是法国人),联系方式是: fc = r"Connexions aux bases de données\MySDEDatabaseConnection.sde\SDE.MyFeatureDataset\SDE.MyFeatureClass"
GeoStoneMarten

好的,如果我需要使用数据库1的第1层并将其裁剪到数据库2中的第2层,那就怎么办?如果有两个单独的工作区,我该如何处理env.workspace?
NULL.Dude

1

根据我之前的评论,我还有另一个主张可以安全地使用要素数据集和要素类

# 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

结果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

结果访问路径:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.