更新和修復數據源 來自: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:\Projects\YosemiteNP\Yosemite.aprx') aprx.updateConnectionProperties(r'C:\Projects\YosemiteNP\Data\Yosemite.gdb', r'C:\Projects\YosemiteNP\Vector_Data\Yosemite.gdb') aprx.save() del aprx - 部分路徑:
以下示例與上述示例非常相似,但該示例將使用部分路徑字符串替換數據源。請確保使用部分字符串時,不會在路徑中多次發生。您可能不會獲得期望的結果。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:\Projects\YosemiteNP\Yosemite.aprx') aprx.updateConnectionProperties('Data','Vector_Data') aprx.save() del aprx - 個人地理數據庫到文件地理數據庫:
以下示例使用地圖中所有圖層和表的部分路徑將個人地理數據庫連接替換為文件地理數據庫連接。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:\Projects\YosemiteNP\Yosemite.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:\Projects\YosemiteNP\Yosemite.aprx') aprx.updateConnectionProperties(r'C:\Projects\YosemiteNP\Vector_Data\Yosemite.gdb', r'C:\Projects\YosemiteNP\DBConnections\Server.sde') aprx.save() del aprx - 使用其他圖層的連接屬性:
以下示例參考地圖中的圖層,並使用連接屬性更新尚未更新新數據源的圖層文件中相同圖層的連接屬性。
import arcpy aprx = arcpy.mp.ArcGISProject(r'C:\Projects\YosemiteNP\Yosemite.aprx') m = aprx.listMaps('Yose*')[0] lyr = m.listLayers('Ranger Stations')[0] lyrFile = arcpy.mp.LayerFile(r'C:\Projects\YosemiteNP\LYRXs\Yosemite\OperationalLayers.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:\Projects\YosemiteNP\Yosemite.aprx') m = aprx.listMaps('Yose*')[0] m.updateConnectionProperties({'dataset': 'PtsInterest'}, {'dataset': 'PointsOfInterest'}) aprx.save() del aprx
