文章版權由作者pxtgis和部落格園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/pxtgis/。
一、概述
在資料處理工作中經常遇到批量裁剪ArcGIS檔案地理資料庫(GDB)的需求。利用ArcGIS進行GDB批量裁剪的方法主要有三種。本文以向量GDB批量裁剪為例。
1、利用ArcToolbox中Analysis Tools工具箱中的Extract工具集下Clip裁剪工具的Batch批量處理(右鍵工具箱即可調出批量裁剪皮膚)。在Input Features下方單元格點選Browse可以批量選取GDB中多個要素(如果有資料集,則需單獨新增要素集中要素類),Clip Features下方單元格點選Open指定裁剪檔案,Output Feature Class這列第一個單元格也會自動填充內容,預設存放在Default.gdb下帶” _Clip”字尾檔名。選中Clip Features列已填充的內容右鍵Fill,即可將該列其他空白單元格填充同樣內容,也可以自己選中特定幾行再點選Fill,則只填充選中的幾行內容。Output Feature Class最好不動,保持預設,因為要修改路徑就得都修改,修改一個其他還是預設。該列空白單元格程式執行時會自動填充同樣路徑,檔名與輸入要素對應,所以無需Fill。點選OK即可執行批量裁剪,裁剪完可以把Default.gdb中的要素拷貝出來。但是Batch批量裁剪工具中裁剪要素只能取一個要素,就算輸入的裁剪要素類中有多個面要素,也只執行第一個進入程式中的要素面。而且,在GDB中包含資料集的情況下,Batch批量處理在瀏覽資料時就很不方便,輸出時也無法保留原始資料集結構。所以針對只需利用一個面要素進行批量裁剪,而且不需要保留GDB要素集結構的情況下,Batch批量處理比較合適。
圖1 Batch Clip介面
2、利用Python,ArcPy站點包編寫程式進行處理。本文先不過多介紹。
3、利用Model Builder製作工作流進行處理。Model Builder包含一組支援構建靈活且功能強大的模型的實用工具,可實現零程式碼對GDB進行批量分割槽裁剪且可選擇是否保留原始GDB要素集要素類結構。這也是本文的重點,下文將詳細介紹。
二、資料
1、待批量分割槽裁剪的市基礎地理資訊資料(部分測試資料,GDB格式),包含要素集和要素類。
2、用於裁剪的市區界(包含多個面要素,shp格式),也可以換成分幅或其他裁剪要素類(包含一個或多個面要素)。
圖2 部分基礎地理資訊資料
三、GDB批量裁剪模型
需求是:利用市區界要素面資料對全市GDB資料進行批量分割槽裁剪出按區名命名的GDB,並且保留原始GDB的要素集結構。
如下圖所示,由於Model Builder中只能新增一個迭代器,所以要用到子模型,甚至子子模型。
1、主模型新增裁剪要素Clip FeatureClass,也就是本文的市區界shp資料,先經過篩選Select(這步可省,為了減少測試資料量加的),然後執行迭代要素選擇,選擇的要素作為兩個裁剪子模型的裁剪要素輸入;同時,在OutputGDB Folder位置建立名為GDB Name (其值為%Value%,行內替換迭代選擇出要素的name屬性) 的檔案地理資料庫OutputGDB, 該GDB作為兩個子模型的輸出GDB引數;InputGDB為待批量分割槽裁剪的GDB,也就是本文的基礎地理資訊庫。
圖3 GDB批量裁剪總模型
2、要素類裁剪子模型中,僅對GDB目錄下的要素類進行迭代裁剪,不遞迴至要素集下的要素類。
圖4 要素類裁剪子模型
3、要素集裁剪子模型1中再巢狀了一個要素集裁剪子模型0。要素集裁剪子模型0中是對要素集裁剪子模型1中的迭代的要素集進行要素類迭代和裁剪。要素集裁剪子模型1中對輸入的基礎地理資訊資料庫進行迭代要素集,同時在總模型中生成的分割槽GDB中建立相應要素集,要素集路徑和迭代的要素集以及迭代的裁剪要素共同作為要素集裁剪子模型0的輸入。
圖5 要素集裁剪子模型
4、本例中的GDB批量裁剪生成的GDB可以保留原始GDB的要素集合要素類的結構。如果不需要輸出原始要素集的結構,可以去掉要素集裁剪子模型1,修改要素類裁剪子模型中迭代要素類的工具的Recursive遞迴選項勾上,則會批量裁剪GDB中包含資料集下的所有要素類,如圖6所示。
圖6 勾選要素集裁剪子模型中遞迴選項
5、執行總模型,模型引數和結果如下。結果為按區界名命名的各個GDB,GDB的要素集合要素類結構也和原GDB結構一致。
圖7 模型執行及結果
四、總結
1、本文參考了《ArcGIS之GDB(檔案地理資料庫)批量處理(20190115)》。
2、模型中三層巢狀有些複雜,下一步還需研究改善。
3、利用模型執行出來存在一些空圖層並沒有刪除,有需求刪除的話可以在模型中再加入批量刪除空圖層工具。
4、需注意若要將裁剪結果寫入網路路徑下可能會報錯無法寫入,將OutputGDB Folder引數改為磁碟絕對路徑就可以正常寫入。