ModelBuilder 是 ArcGIS for Desktop 產品中最可愛的功能之一,它可以盡可能免代碼地將我們從重復勞動中解放出來。使用 ModelBuilder 的過程常常被比喻為“搭積木”,我們只需要拿著 ArcGIS for Desktop 中為我們提供的“積木”去搭建滿足於自己的特定工作流模型。
再打個比方,我們要實現的某個功能比作是自己做面包。首先要准備食材,例如面粉、牛奶、雞蛋、黃油、糖、鹽、酵母,類比為 地理數據; 食材齊備了,就可以順序開始和面、發酵、烘焙,這些工作由特定的器具承擔,例如各種烘焙工具、烤箱,就好比ArcGIS提供的 工具,例如 ArcToolbox中的工具們; 面包制作過程中可以根據自己口味,規定發酵時間、控制糖和鹽的多少等,這就類比為工具的自定義 參數 。
如果自己享受整個烘焙的過程,不厭其煩地面面俱到,那大可維持現狀;可是如果你覺得做面包是個體力活,你只是想吃到自家面包,而希望把做面包的過程“外包”出去,那麼面包機的市場就來了。這篇blog就和大家說說如何制作“面包機”。
我們從一個簡單常見的實例開始……
需求:現有一些表示各種研究對象的地理數據,小明希望把所有研究數據變換到需要的坐標系統,並且全部裁剪至研究范圍。
如果只有一份數據,小明會不假思索的找到 ArcToolbox中的 Project和Clip工具,順序執行即可解決問題;如果是3+份數據,小明可能會想,該做個工具了。
從【地理處理】菜單,打開 ModelBuilder,依次拖拽和連接 Project 和 Clip 兩個工具。Project 工具的輸出作為 Clip 工具的輸入。
雙擊工具可以打開工具繼續填補工具需要的參數,直至Model因參數完全而變成彩色。
<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxoMSBpZD0="3-使用迭代器">3 使用迭代器
前一步的工具已經滿足一次任務的需要了,接著就是解決批量處理的問題。ModelBuilder提供了一些額外的自帶工具來滿足我們的一些高級需求,其中一類就是 迭代器,它用來實現循環。
在這個例子中,需要遍歷的對象是表示各種研究對象的要素類,因此選擇 迭代要素類 / Iterate Feature Classes。當然也可以根據自己的實際需求選擇其他迭代器。
接下來就是把迭代器與工具串聯起來。首先,雙擊迭代器的六邊形為迭代器設置工作空間,即地理數據庫/GDB,或者文件夾目錄(例如shapefile所在的目錄)。這樣,迭代器會在指定的工作空間遍歷要素類。刪除現有Project工具的輸入數據,將迭代器的輸出數據連接到Project工具。
工具基本准備完畢,但是還差了重要的一步。目前,最後的輸出數據是常量,也就是說,即使前面的工具執行了N次,那結果都將被同名覆蓋。那麼,行內變量 就顯出用武之地了。
迭代器每次遍歷到一個要素類,會返回一個 Name,內容是當前要素類的名稱,這個Name就是行內變量。引用的方法就是使用百分號括起來,即 %Name% 。
輸出數據設置示例:
至此我們就完成了一次批量任務。
如果我們以後想按照這個相同的需求處理數據,完全可以將其做成模型工具。將輸入數據和輸出數據設置為模型變量,我們就可以在“運行”狀態下使用。
設置方法,在需要作為參數方便後續修改的項目上右鍵,勾選 “模型參數”即可,然後項目的頭上頂了個“P”,( ̄▽ ̄)”。
將模型保存至工具箱後,雙擊運行工具。現在就可以把它當成“面包機”,放入食材,等面包即可。
下面是些有用的提示,FYI:
每個模型僅可使用唯一一個迭代器。如果模型中已經存在一個迭代器,那麼用於添加迭代器的菜單就不可用了。這是限制之一。
如果將含有迭代器的模型導出為 Python 腳本,則導出的腳本中將不會包括迭代邏輯。這是限制之二。Python中有list函數,也可以實現類似的需求,但是需要重寫。
盡管Model可以嵌套調用,但是迭代器的嵌套循環邏輯不佳,不建議使用。如果需要實現嵌套循環,強烈建議使用python腳本。例如,實現遍歷工作空間內每個要素類中的每個要素(記錄)這樣的需求,可以使用 ArcPy中的函數 ListFeatureClasses 和 SearchCursor來實現。