1.自定義工具箱是什么就像名字一樣,自定義工具箱是由個人創(chuàng)建的工具箱,就像下面這樣,可以理解成一個 .tbx 后綴的壓縮包,每一個工具箱中都可以添加多個工具集、腳本工具甚至模型構(gòu)建器工具。 1.1如何添加自定義工具箱(熟悉可跳過)第一步:右鍵點擊 ArcToolbox -> 添加工具箱 第二步:在打開的添加工具箱窗口中選中需要添加的工具,然后點擊右下角的打開即可。 1.2如何創(chuàng)建自定義工具箱點擊右上角的紅色工具箱符號,可以新建并重命名一個工具箱。 我們這里新創(chuàng)建了一個海怪工具箱,用于之后的教程演示。 1.3添加一個腳本工具新創(chuàng)建的工具箱就像一個大箱子,箱子呢是用來裝工具的,你可以直接在工具箱中右鍵,然后點擊添加,再點擊腳本,進而創(chuàng)建一個腳本工具; 亦或是右鍵,點擊新建,再點擊工具集,創(chuàng)建一個可以自定義名稱的工具集,然后在工具集里新建一個腳本工具。 這里添加的腳本工具只是一個空殼,我們后面會繼續(xù)完善。 新建的工具箱位于 ../Chapter7/海怪工具箱.tbx。 2.工具箱的封裝工具箱由三部分組成,其中有兩部分需要我們來控制:
所以下面的重點就是輸入界面和 Python 源代碼。 2.1工具箱輸入界面工具箱輸入界面,或者說圖形交互界面(GUI),就像下面的幾張圖一樣,從該界面我們可以控制工具的行為,自定義輸入界面然后配合 Python 腳本,可以實現(xiàn)多種客制化的功能。 簡單來說,你可以認(rèn)為輸入界面是依托于 Arcmap 的“前端”,腳本代碼就是負(fù)責(zé)運行的“后端”。 導(dǎo)入導(dǎo)出工具: 為方便演示,制作一個非常簡單的工具箱,它的功能呢就是把輸入的要素類(數(shù)據(jù)庫或者 shp )再導(dǎo)出來而已,是完全沒有用的導(dǎo)入導(dǎo)出功能啦,不過作為演示還是非常不錯的。 第一步: 在工具箱中,右鍵點擊添加,再點擊腳本,然后修改名稱,修改成你想要的名字,勾選存儲相對路徑名,然后點擊下一頁。 第二步: 然后添加腳本文件,添加該腳本文件 ../Chapter7/toolscript/input_and_output.py,讀者可以在最后的下載包中找到該文件。 然后點擊下一頁。 第三步: 控制用戶交互界面。ArcGIS 在這里內(nèi)置了一整套簡單但是實用的圖形控件,比如輸入菜單、下拉框、多選框、單選等,借由這些圖形控件我們可以控制腳本工具的圖形交互界面。 我們這里使用的腳本功能非常簡單,上面也有說到:輸入一個矢量要素類,不做任何處理,然后輸出一個矢量要素類。 為了匹配這個腳本,我們需要設(shè)置一個輸入圖層的控件,同時為了能順利的輸出,也需要一個輸出圖層的控件,注意一個是輸入一個是輸出。 從下圖可以看到,左邊(左邊的橙色框)是顯示名稱,其中輸入輸出控件的名稱以及輸入控件的名稱,這里命名為輸入要素和輸出要素;然后在右邊(右邊的橙色框)的數(shù)據(jù)類型下拉框中,我們選擇要素圖層,這里只能做選擇,不能任意輸入。 那么輸入輸出是如何區(qū)分的呢? 選中輸入要素(變成藍(lán)色),然后可以看到下方(下方橙色框)的參數(shù)屬性設(shè)置選項卡,這里可以對參數(shù)進行調(diào)整。 ① 類型:有三種,一般只會用到 Required 和 Optional,表示必須和可選,用于控制參數(shù)是否可以忽略不填; ② 方向:兩種,Input 和 Output,表示輸入和輸出,大部分情況都是使用 Input 來獲得參數(shù),Output 用于獲得最后的成果數(shù)據(jù),像是矢量、柵格或者圖表; ③ 多值:Yes 或者 No,用于輸入多個相同類型的數(shù)據(jù),工具打開后就是下面這樣,在輸入要素中可輸入多個要素類; ④ 默認(rèn):設(shè)置一個控件的默認(rèn)值,直接輸入即可??膳浜?/span>多值一同使用,使用 ; (英文的分號)分開, 結(jié)果如下,可以看到一打開該工具就已經(jīng)填充上了預(yù)設(shè)的多個默認(rèn)值(報錯是因為數(shù)據(jù)類型不是要素圖層); ⑤ 環(huán)境:工具箱的環(huán)境設(shè)置,比如掩膜、容差范圍、默認(rèn)數(shù)據(jù)庫位置等,一般不預(yù)先設(shè)置; ⑥ 過濾器:選擇文件類型可以在選擇文件時只顯示特定格式的文件; ⑦ 獲取自:指定數(shù)據(jù)的獲取源。這是個什么意思呢?比如我們想要獲取圖層A的某個字段,獲取源就是圖層A。 以下面這種圖作為例子,新增名為字段的控件(上方的橙色框),數(shù)據(jù)類型也是字段,然后參數(shù)屬性中獲取自選擇輸入要素(下方橙色框)。 點擊完成后,打開腳本工具。在輸入要素框中選擇一個圖層,然后再點擊獲取字段,如下就可以選擇圖層中的字段了。 ⑧ 符號系統(tǒng):在最下面還有一個符號系統(tǒng),通常只能作用于輸出的矢量圖層(方向:Output),可為輸出圖層指定設(shè)置好的 lyr 文件樣式。 第四步: 點擊右下方的完成,那么腳本工具的輸入界面就完成了。 2.2 Python 腳本工具箱輸入界面和 Python 代碼要相互配合才行,工具箱界面中的輸入、輸出以及各種各樣的參數(shù),在 Python 腳本文件中都得一一對應(yīng)上,將輸入界面中的各個參數(shù)傳給 Python 腳本,這樣才能讓 Python 腳本按照預(yù)期的效果正常運行。 看上去有點麻煩,但實際上 arcpy 中提供了現(xiàn)成的函數(shù)就可以直接獲得參數(shù)。 ①參數(shù)對接(獲?。?/strong> 至于如何對接參數(shù),我們使用剛剛的那個腳本文件舉例: ../Chapter7/toolscript/input_and_output.py ?1?:arcpy 提供了 如果有更多參數(shù),以此類推。 ②參數(shù)對接中應(yīng)該注意的情況 如果你只是輸入輸出地址這種,那么沒有問題,因為地址本來就是字符串,但是如果你設(shè)置了一個選擇長度范圍的長整型的控件、亦或是某種布爾值選擇,最后輸入到 python 腳本這里都會變成字符串。
③更好的參數(shù)獲取寫法 上面例子是一個一個的獲取參數(shù),但是如果參數(shù)很多呢?10個參數(shù)難道寫10遍 ?2?:使用 使用這種方法可以顯得比較厲害,同時精簡代碼。 ④信息輸出 難免想要在代碼中打 print,不管是作為臨時的“斷點”檢查一下,還是作為長期的信息輸出。 那么在工具箱中如何向外面輸出信息呢? arcpy 提供了 ?3?:我們在這里使用 ⑤導(dǎo)入腳本 到這里基本上工具就完成了,只不過 Python 腳本和自定義工具箱是分開,創(chuàng)建的工具在運行的時候會根據(jù)相對路徑位置(如果你一開始勾選了存儲相對路徑名)尋找 Python 腳本,找到并運行。 不過你愿意的話,也可以把 Python 腳本文件導(dǎo)入到工具箱中,這樣帶著一個工具箱就行了。 3. 工具箱的各種錯誤和注意事項3.1“限定”的錯誤讓我如此苦惱、如此害怕的,就是把寫好的 Python 腳本封裝成 ArcGIS 的工具箱。 每次我把程序代碼寫好,也能正常的運行,然后將其導(dǎo)入自定義工具箱中,點擊運行之前還得沐浴更衣好好的祈禱一番,愿天公助我。 然而事與愿違,剛剛還好好的程序報錯了,錯誤可謂是千奇百怪,大部分時候都在說謎語,明明顯示第100行有什么什么錯,結(jié)果一看,100行是空行... 顯然,ArcGIS 工具箱有一些特別的魔法,擁有一些專屬自己的“限定”錯誤,這種錯誤只有在這里才能品味到。 還不快跟著我嘗一嘗新鮮的魔法shit。
3.2工具箱名字導(dǎo)致的錯誤我們先從最簡單的錯誤開始。 工具箱名稱導(dǎo)致的錯誤: 由于輸出路徑會自動填入工具箱的名字,中間有特殊符號的話,比如:“-”,就會報錯。 3.2縮進錯誤詭異的錯誤來了,報錯顯示如下。我都不知道是說的什么鬼話,怎么還有縮進錯誤? 鎖定到報錯提示的地方,是這樣的: 看上去非常正常,100%正常,開始我不信是這里的問題,我開始折騰,狂寫 print 語句,使勁打斷點,使勁測試,最后機緣巧合之下,我把中文注釋移到了上方,然后就順利運行了。 好吧,由于把 else 和中文注釋寫到一行,導(dǎo)致 else 被莫名其妙被跳過了,所以導(dǎo)致錯誤。 3.3兩種“變量”錯誤第一種: global name xx is not defined 第二種: name xx is not defined 這個錯是纏繞我最久的,每次出這種錯誤我都到處測試,偶爾莫名其妙就好了,但是一直不知道原因,直到后來我懷疑是不是也是中文字符造成的錯誤,結(jié)果發(fā)現(xiàn),嘿,還真是! 比如錯誤處的代碼是這樣的,在變量 pta2 的上面是一行中文注釋: 我們使用空行將報錯的變量和中文注釋隔開: 于是乎,程序順利運行了,原來如果在變量的上一行是中文注釋,有可能會導(dǎo)致下面那一行被工具箱里面的神奇魔法規(guī)則跳過。 自此,困擾我很久、經(jīng)常讓我折騰到深夜的各種暗坑終于有了解決方法。 個人的經(jīng)驗,希望能對你有所幫助和啟發(fā)。 4.最后和總結(jié)總結(jié):
使用版本:
源代碼、教學(xué)文檔離線小冊子下載: |
|