1. 程式人生 > >ArcGIS Python指令碼二之查詢和修復丟失的資料鏈接

ArcGIS Python指令碼二之查詢和修復丟失的資料鏈接

 

    當對GIS的資料來源進行移動、格式轉換或刪除等操作時,往往會導致地圖文件或圖層檔案中的資料丟失連結,這時將無法顯示地圖資料。

    如果使用arcpy.mapping模組編寫指令碼,則無需開啟地圖文件就可以自動查詢修復丟失的資料來源。

    相關術語的定義:

  • 工作空間    ——    工作空間是一種資料容器,它可以是一個資料夾(就shapefile而言)、個人地理資料庫、檔案地理資料庫或ArcSDE連線等。工作空間確定了該工作空間的系統路徑。對於檔案地理資料庫來說,工作空間的系統路徑包括該地理資料庫的名稱
  • 資料集    ——    資料集是工作空間中的要素類或表。
  • 資料來源    ——    資料來源是工作空間和資料集的組合

一、查詢地圖文件和圖層檔案中丟失的資料來源

    arcpy.mapping模組中的ListBrokenDataSources()函式,可以返回一個圖層列表,列表中的物件是地圖文件或圖層檔案中已經丟失了資料鏈接的圖層。

    程式碼示例

import arcpy.mapping as mapping     # 匯入arcpy.mapping模組
    
mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd")  # 引用KeLaMaYi.mxd地圖文件檔案

listBrokenDS = mapping.ListBrokenDataSources(mxd)   # 獲取丟失了資料來源的圖層列表

""" 迭代列表,輸出圖層名稱"""
for layer in listBrokenDS:
    print(layer.name)

    結果輸出丟失了資料來源的各個圖層的名稱列表:

二、使用MapDocument.findAndReplaceWorkspacePaths()方法修復丟失的資料來源

    MapDocument.findAndReplaceWorkspacePaths()方法用於執行全域性查詢,並替換地圖文件中圖層和表的工作空間路徑。

    它還可以同時替換多種工作空間型別的路徑,例如可以同時替換個人地理資料庫檔案地理資料庫兩種工作空間型別。

    MapDocument.findAndReplaceWorkspacePaths()

方法接受兩個引數:

  • 舊工作空間路徑
  • 新工作空間路徑

    程式碼示例:

import arcpy.mapping as mapping   # 匯入製圖模組

mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd") # 引用KeLaMaYi.mxd地圖文件檔案

""" 修復地圖文件中資料來源的路徑 """
""" MapDocument.findAndReplaceWorkspacePaths()方法中,第1個引數是原路徑,第2個引數是新路徑 """
mxd.findAndReplaceWorkspacePaths(r"E:\work\KeLaMaYi.gdb", r"E:\work\ansoData\serverData\KeLaMaYi\onlineData\KeLaMaYi.gdb")

""" 修復資料來源並不會在當前地圖文件中體現出來 """
""" 所以將已經修復資料來源的結果儲存到新的.mxd檔案中"""
mxd.saveACopy(r"E:\work\KeLaMaYiFixed.mxd")

    LayerTableView物件也有findAndReplaceWorkspacePaths()方法,可以執行相同的操作。

    不同之處在於,LayerTableView物件中的findAndReplaceWorkspacePaths()方法只能用來修復單個丟失的資料來源,不能進行全域性查詢並替換地圖文件中所有丟失的資料來源

三、使用MapDocument.replaceWorkspaces()方法修復丟失的資料來源

    使用MapDocument.replaceWorkspaces()方法可以將資料集自動更新到不同型別的工作空間中。

    MapDocument.replaceWorkspaces()法的引數包括:

  • 原始工作空間路徑
  • 原始工作空間型別
  • 新工作空間路徑
  • 新工作空間型別

    必須確保提供的工作空間型別與相應的資料集相匹配。    

    表示工作空間型別的引數是以字串關鍵字的形式傳遞給該方法的,有效的工作空間型別如下所示:

  • ACCESS_WORKSPACE    ——    個人地理資料庫或Access工作空間
  • ARCINFO_WORKSPACE    ——    ArcInfo coverage工作空間
  • CAD_WORKSPACE    ——    CAD檔案工作空間
  • EXCEL_WORKSPACE    ——    Excel檔案工作空間
  • FILEGDB_WORKSPACE    ——    檔案地理資料庫工作空間
  • OLEDB_WORKSPACE    ——    OLE資料庫工作空間
  • PCCOVERAGE_WORKSPACE    ——    PCARC/INFO Coverage工作空間
  • RASTER_WORKSPACE    ——    柵格工作空間
  • SDE_WORKSPACE    ——    SDE地理資料庫工作空間
  • SHAPEFILE_WORKSPACE    ——   shapefile工作空間
  • TEXT_WORKSPACE    ——    文字檔案工作空間
  • TIN_WORKSPACE    ——    TIN工作空間
  • VPF_WORKSPACE    ——    VPF工作空間   

    示例:

import arcpy.mapping as mapping

mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd")

mxd.replaceWorkspaces(r"E:\work\KeLaMaYi.gdb", "FILEGDB_WORKSPACE", r"E:\work\temp", "SHAPEFILE_WORKSPACE")

mxd.saveACopy("E:\work\KeLaMaYi_DataLinksUpdated.mxd")

四、使用replaceDataSource()方法修復單個圖層和表物件

    LayerTableView類都有replaceDataSource()方法,該方法可以改變單個圖層或表的工作空間路徑、工作空間型別和資料集名稱。

    replaceDataSource()方法接受四個引數:

  • 新工作空間的路徑
  • 新工作空間型別
  • 新資料集名稱 (可選)
  • 布林值,如果設定為True,只有當新工作空間路徑的值是有效的工作空間時,工作空間才會進行更新。

    示例

import arcpy.mapping as mapping     # 匯入arcpy站點包

mxd = mapping.MapDocument(r"C:\ArcpyBook\Ch3\Crime_DataLinksLayer.mxd") # 引用地圖文件

df = mapping.ListDataFrames(mxd, "Crime")[0]    # 引用對應資料框
lyr = mapping.ListLayers(mxd, "Burglary", df)[0] # 引用需要改變資料來源的圖層

""" 改變圖層的資料來源 """
""" replaceDataSource()方法引數分別為新工作空間路徑、新工作空間型別、新資料集名稱"""
lyr.replaceDataSource(r"C:\ArcpyBook\data", "SHAPEFILE_WORKSPACE", "Burglaries_2009")
""" 將結果儲存到新的地圖文件檔案中 """
mxd.saveACopy(r"C:\ArcpyBook\Ch3\Crime_DataLinksNewLayer.mxd")

    LayerTableView類也有findAndReplaceWorkspacePath()方法,它與MapDocument.findAndReplaceWorkspacePaths()方法非常相似。

    唯一不同的是,該方法只處理單個LayerTableView類,而不是迭代全部地圖文件或地圖檔案。    

五、查詢資料夾中所有地圖文件內丟失的資料來源

    可以使用ArcGIS python指令碼的迴圈結構來搜尋資料夾中的地圖文件檔案,查詢這些地圖文件中丟失的資料來源,並將丟失資料鏈接的圖層名稱寫入一個文字檔案中。

    這裡需要用到os.walk()方法,os.walk()方法是一個簡單、易用的檔案、目錄遍歷器,可以幫助我們高效的處理檔案、目錄方面的事情。

    os.walk()方法語法格式如下:

    引數

    top    ——    要遍歷的目錄的地址,返回的是一個三元組(root,dirs,files)

  • root     ——    當前正在遍歷的這個資料夾的本身的地址
  • dirs    ——    dirs是一個列表,內容是該資料夾中所有的目錄的名字
  • files    ——    同樣是列表,內容是該資料夾中所有的檔案

    其他的引數就不列出來了。

    示例

import arcpy.mapping as mapping, os     # 匯入arcpy模組和os模組

f = open('BrokenDataList.txt', 'w')

""" 建立for迴圈並使用os.walk()方法來遍歷目錄樹,os.walk()方法的引數為要遍歷資料夾的路徑。"""
for root, dirs, files in os.walk("C:\ArcpyBook"):
    for name in files:                  # 遍歷所有返回的檔案
        filename = os.path.join(root, name) # 將根目錄路徑和檔案路徑合併
        if ".mxd" in filename:      # 判斷副檔名以確定檔案是否為地圖文件檔案
            mxd = mapping.MapDocument(filename)     # 引用地圖文件
            f.write("MXD: " + filename + "\n")      # 寫入對應的地圖文件檔案的檔名
            brknList = mapping.ListBrokenDataSources(mxd)      # 返回地圖文件中丟失資料來源的圖層的列表
            for brknItem in brknList:           # 遍歷丟失資料來源圖層的列表
                print("Broken data item: " + brknItem.name + " in " + filename)
                f.write("\t" + brknItem.name + "\n")    # 寫入丟失資料來源圖層的名稱

""" 新增print語句,用來表明工作完成,然後關閉檔案 """
print("All done") 
f.close()