更新和修复数据源 来自:https://pro.arcgis.com/zh-cn/pro-app/arcpy/mapping/updatingandfixingdatasources.htm
在许多情况下,您都可能需要修复数据源或重定向数据源至其他位置。在每个相关地图或工程中进行手动更改将会异常麻烦。arcpy.mp 脚本环境提供了多种方法使得您无需打开工程即可自动进行更改。您可针对各个图层或表逐一更新数据源,也可一次更新同一工作空间中的所有图层或表。
以下成员用于更改数据源工作流:
- connectionProperties 属性适用于 Layer 和 Table 类。
- updateConnectionProperties 方法适用于 ArcGISProject、Layer、LayerFile、Map 和 Table 类。
使用 updateConnectionProperties 函数
updateConnectionProperties 函数可以被视为是一个用 new_connection_info 参数替换 current_connection_info 参数的查找与替换函数。这些参数既可以是到工作空间、部分字符串、包含连接属性的字典、定义特定键的部分字典的完整路径,也可以是到数据库连接 (.sde) 文件的路径。下面提供了上述内容的一个示例。
使用企业级地理数据库时,到数据库连接 (.sde) 文件的路径只能用于 new_connection_info 参数。将图层的连接属性从文件地理数据库更新到企业级地理数据库时,基础 workspace_factory 连接属性会自动切换。这允许您将指向 .gdb 文件的路径替换为指向 .sde 文件的路径。
将图层连接属性从个人地理数据库更新为文件地理数据库时,基础 workspace_factory 连接属性将自动切换。这允许您将指向 .mdb 文件的路径替换为指向 .gdb 文件的路径。
auto_update_joins_and_relates 属性允许您控制是否应更新连接、关联或与图层或表相关的事件。将默认值设为 True。有时,尤其是在更新工程级别的所有数据源时,您不希望这些相关的数据源更新。如果是这种情况,请确保将该参数值设置为 False。
在默认情况下,updateConnectionProperties 方法仅在 new_connection_info 是有效数据源的情况下更新数据源。如果将 validate 参数设置为 False,则将数据源设置到该位置,而不考虑其现有位置。这对尚未创建数据时需要更新数据源的情况十分有用。在上述情况下,数据在关联的地图中将显示为已损坏。
以下是一些示例:
- 完整文件路径:
以下脚本将更改工程中所有图层和表的文件地理数据库数据源的完整路径。在本示例中,对文件夹进行了重命名,并将所有矢量数据移动到了这一新位置。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') aprx.updateConnectionProperties(r'C:ProjectsYosemiteNPDataYosemite.gdb', r'C:ProjectsYosemiteNPVector_DataYosemite.gdb') aprx.save() del aprx
- 部分路径:
以下示例与上述示例非常相似,但该示例将使用部分路径字符串替换数据源。请确保使用部分字符串时,不会在路径中多次发生。您可能不会获得期望的结果。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') aprx.updateConnectionProperties('Data','Vector_Data') aprx.save() del aprx
- 个人地理数据库到文件地理数据库:
以下示例使用地图中所有图层和表的部分路径将个人地理数据库连接替换为文件地理数据库连接。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') m = aprx.ListMaps("Yose*")[0] m.updateConnectionProperties(r'Background.mdb', 'Background_fGDB.gdb') aprx.save() del aprx
- 使用数据库连接 (.sde) 文件:
以下示例将文件地理数据库连接替换为工程中所有图层和表的数据库连接 (.sde) 文件的路径。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') aprx.updateConnectionProperties(r'C:ProjectsYosemiteNPVector_DataYosemite.gdb', r'C:ProjectsYosemiteNPDBConnectionsServer.sde') aprx.save() del aprx
- 使用其他图层的连接属性:
以下示例参考地图中的图层,并使用连接属性更新尚未更新新数据源的图层文件中相同图层的连接属性。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') m = aprx.listMaps('Yose*')[0] lyr = m.listLayers('Ranger Stations')[0] lyrFile = arcpy.mp.LayerFile(r'C:ProjectsYosemiteNPLYRXsYosemiteOperationalLayers.lyrx') for l in lyrFile.listLayers(): if l.name == 'Ranger Stations': l.updateConnectionProperties(l.connectionProperties, lyr.connectionProperties) lyrFile.save() del aprx, lyrFile
- 使用部分字典:
以下示例针对特定地图中的图层将数据源的数据集名称从 PtsInterest 更新为 PointsOfInterest。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:ProjectsYosemiteNPYosemite.aprx') m = aprx.listMaps('Yose*')[0] m.updateConnectionProperties({'dataset': 'PtsInterest'}, {'dataset': 'PointsOfInterest'}) aprx.save() del aprx