免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
搜羅全網!ArcGIS二次開發(fā)Python(arcpy)指南(七):你也可以制作ArcGIS工具箱
前言:讓自定義工具箱變得簡單如喝水一樣。
1.自定義工具箱是什么
就像名字一樣,自定義工具箱是由個人創(chuàng)建的工具箱,就像下面這樣,可以理解成一個 .tbx 后綴的壓縮包,每一個工具箱中都可以添加多個工具集、腳本工具甚至模型構建器工具。
一大堆工具箱1.1如何添加自定義工具箱(熟悉可跳過)
第一步:右鍵點擊 ArcToolbox -> 添加工具箱
第二步:在打開的添加工具箱窗口中選中需要添加的工具,然后點擊右下角的打開即可。
添加工具箱到 Arcmap1.2如何創(chuàng)建自定義工具箱
點擊右上角的紅色工具箱符號,可以新建并重命名一個工具箱。
我們這里新創(chuàng)建了一個海怪工具箱,用于之后的教程演示。
新建工具箱1.3添加一個腳本工具
新創(chuàng)建的工具箱就像一個大箱子,箱子呢是用來裝工具的,你可以直接在工具箱中右鍵,然后點擊添加,再點擊腳本,進而創(chuàng)建一個腳本工具;
亦或是右鍵,點擊新建,再點擊工具集,創(chuàng)建一個可以自定義名稱的工具集,然后在工具集里新建一個腳本工具。
這里添加的腳本工具只是一個空殼,我們后面會繼續(xù)完善。
新建的工具箱位于 ../Chapter7/海怪工具箱.tbx。
2.工具箱的封裝
工具箱由三部分組成,其中有兩部分需要我們來控制:
一是輸入界面:確定工具箱輸入界面的參數定義和設置;
二是 Python 源代碼:功能的實現,為 .py 后綴的腳本文件;
三是對參數行為提供額外控制的可選驗證代碼,其位于工具箱中(這部分自帶,基本上不用修改)。
所以下面的重點就是輸入界面和 Python 源代碼。
2.1工具箱輸入界面
工具箱輸入界面,或者說圖形交互界面(GUI),就像下面的幾張圖一樣,從該界面我們可以控制工具的行為,自定義輸入界面然后配合 Python 腳本,可以實現多種客制化的功能。
簡單來說,你可以認為輸入界面是依托于 Arcmap 的“前端”,腳本代碼就是負責運行的“后端”。
導入導出工具:
為方便演示,制作一個非常簡單的工具箱,它的功能呢就是把輸入的要素類(數據庫或者 shp )再導出來而已,是完全沒有用的導入導出功能啦,不過作為演示還是非常不錯的。
制作完成后的導入導出工具的界面第一步:
在工具箱中,右鍵點擊添加,再點擊腳本,然后修改名稱,修改成你想要的名字,勾選存儲相對路徑名,然后點擊下一頁。
修改名稱第二步:
然后添加腳本文件,添加該腳本文件 ../Chapter7/toolscript/input_and_output.py,讀者可以在最后的下載包中找到該文件。
然后點擊下一頁。
鏈接python腳本第三步:
控制用戶交互界面。ArcGIS 在這里內置了一整套簡單但是實用的圖形控件,比如輸入菜單、下拉框、多選框、單選等,借由這些圖形控件我們可以控制腳本工具的圖形交互界面。
我們這里使用的腳本功能非常簡單,上面也有說到:輸入一個矢量要素類,不做任何處理,然后輸出一個矢量要素類。
為了匹配這個腳本,我們需要設置一個輸入圖層的控件,同時為了能順利的輸出,也需要一個輸出圖層的控件,注意一個是輸入一個是輸出。
從下圖可以看到,左邊(左邊的橙色框)是顯示名稱,其中輸入輸出控件的名稱以及輸入控件的名稱,這里命名為輸入要素和輸出要素;然后在右邊(右邊的橙色框)的數據類型下拉框中,我們選擇要素圖層,這里只能做選擇,不能任意輸入。
設置名稱和數據類型那么輸入輸出是如何區(qū)分的呢?
選中輸入要素(變成藍色),然后可以看到下方(下方橙色框)的參數屬性設置選項卡,這里可以對參數進行調整。
參數選項① 類型:有三種,一般只會用到 Required 和 Optional,表示必須和可選,用于控制參數是否可以忽略不填;
② 方向:兩種,Input 和 Output,表示輸入和輸出,大部分情況都是使用 Input 來獲得參數,Output 用于獲得最后的成果數據,像是矢量、柵格或者圖表;
③ 多值:Yes 或者 No,用于輸入多個相同類型的數據,工具打開后就是下面這樣,在輸入要素中可輸入多個要素類;
④ 默認:設置一個控件的默認值,直接輸入即可。可配合多值一同使用,使用 ; (英文的分號)分開,
結果如下,可以看到一打開該工具就已經填充上了預設的多個默認值(報錯是因為數據類型不是要素圖層);
⑤ 環(huán)境:工具箱的環(huán)境設置,比如掩膜、容差范圍、默認數據庫位置等,一般不預先設置;
⑥ 過濾器:選擇文件類型可以在選擇文件時只顯示特定格式的文件;
⑦ 獲取自:指定數據的獲取源。這是個什么意思呢?比如我們想要獲取圖層A的某個字段,獲取源就是圖層A。
以下面這種圖作為例子,新增名為字段的控件(上方的橙色框),數據類型也是字段,然后參數屬性中獲取自選擇輸入要素(下方橙色框)。
設置字段控件點擊完成后,打開腳本工具。在輸入要素框中選擇一個圖層,然后再點擊獲取字段,如下就可以選擇圖層中的字段了。
獲取圖層的字段⑧ 符號系統:在最下面還有一個符號系統,通常只能作用于輸出的矢量圖層(方向:Output),可為輸出圖層指定設置好的 lyr 文件樣式。
設置符號系統第四步:
點擊右下方的完成,那么腳本工具的輸入界面就完成了。
2.2 Python 腳本
工具箱輸入界面和 Python 代碼要相互配合才行,工具箱界面中的輸入、輸出以及各種各樣的參數,在 Python 腳本文件中都得一一對應上,將輸入界面中的各個參數傳給 Python 腳本,這樣才能讓 Python 腳本按照預期的效果正常運行。
看上去有點麻煩,但實際上 arcpy 中提供了現成的函數就可以直接獲得參數。
①參數對接(獲?。?div style="height:15px;">
至于如何對接參數,我們使用剛剛的那個腳本文件舉例:
../Chapter7/toolscript/input_and_output.py
# -*- coding:utf-8 -*-import arcpy#?1?input_lyr = arcpy.GetParameterAsText(0)output = arcpy.GetParameterAsText(1)if __name__ == '__main__':    lyr = arcpy.mapping.Layer(input_lyr)    arcpy.CopyFeatures_management(lyr, output)
?1?:arcpy 提供了 GetParameterAsText(index) 函數,該函數根據輸入界面的排序號碼獲得指定的參數。比如  GetParameterAsText(0) 獲得的就是輸入圖層參數, GetParameterAsText(1)  獲得的就是第二個參數,也就是輸出圖層參數。
如果有更多參數,以此類推。
②參數對接中應該注意的情況
GetParameterAsText(index) 從輸入界面獲得的參數都會轉變成字符串,沒錯都是字符串。
如果你只是輸入輸出地址這種,那么沒有問題,因為地址本來就是字符串,但是如果你設置了一個選擇長度范圍的長整型的控件、亦或是某種布爾值選擇,最后輸入到 python 腳本這里都會變成字符串。
整數變成字符串,使用 int(str) 規(guī)避;
布爾型變成字符串,True 變成了 "True",False 變成了 "False",這樣就不能判斷真假了,需要寫一個判斷語句或者隨便你,方法很多;
還有就是一個輸入控件多值的情況,所有值根據先后連接成一個字符串,中間由 、(英文分號)間隔,可以使用 split 函數分開;
...更多的情況都是大同小異,多試幾次就會了。
③更好的參數獲取寫法
上面例子是一個一個的獲取參數,但是如果參數很多呢?10個參數難道寫10遍 GetParameterAsText(index) ?
# -*- coding:utf-8 -*-def in_and_out(in_lyr, out_lyr):    lyr = arcpy.mapping.Layer(in_lyr)    arcpy.CopyFeatures_management(lyr, out_lyr)if __name__ == '__main__':    #?2?    argv = tuple(arcpy.GetParameterAsText(i)                 for i in range(arcpy.GetArgumentCount()))    in_and_out(*argv)
?2?:使用 GetArgumentCount() 函數獲取一個有幾個參數,然后一次性把所有參數拿到,最后在函數中使用 *argv 解包即可。
使用這種方法可以顯得比較厲害,同時精簡代碼。
④信息輸出
難免想要在代碼中打 print,不管是作為臨時的“斷點”檢查一下,還是作為長期的信息輸出。
那么在工具箱中如何向外面輸出信息呢?
arcpy 提供了 AddMessage(str) 方法向外界傳遞消息。
# -*- coding:utf-8 -*-def in_and_out(in_lyr, out_lyr):    lyr = arcpy.mapping.Layer(in_lyr)    #?3?        arcpy.AddMessage("Hello World")    arcpy.CopyFeatures_management(lyr, out_lyr)if __name__ == '__main__':        argv = tuple(arcpy.GetParameterAsText(i)                 for i in range(arcpy.GetArgumentCount()))    in_and_out(*argv)
?3?:我們在這里使用  AddMessage("Hello World"), 然后運行腳本工具,在完成界面可以看到輸出的 Hello World 信息。
⑤導入腳本
到這里基本上工具就完成了,只不過 Python 腳本和自定義工具箱是分開,創(chuàng)建的工具在運行的時候會根據相對路徑位置(如果你一開始勾選了存儲相對路徑名)尋找 Python 腳本,找到并運行。
不過你愿意的話,也可以把 Python 腳本文件導入到工具箱中,這樣帶著一個工具箱就行了。
3. 工具箱的各種錯誤和注意事項
3.1“限定”的錯誤
讓我如此苦惱、如此害怕的,就是把寫好的 Python 腳本封裝成 ArcGIS 的工具箱。
ArcGIS 工具箱每次我把程序代碼寫好,也能正常的運行,然后將其導入自定義工具箱中,點擊運行之前還得沐浴更衣好好的祈禱一番,愿天公助我。
然而事與愿違,剛剛還好好的程序報錯了,錯誤可謂是千奇百怪,大部分時候都在說謎語,明明顯示第100行有什么什么錯,結果一看,100行是空行...
顯然,ArcGIS 工具箱有一些特別的魔法,擁有一些專屬自己的“限定”錯誤,這種錯誤只有在這里才能品味到。
還不快跟著我嘗一嘗新鮮的魔法shit。
Note:以下所有錯誤均是將腳本封裝成工具箱后,運行才可能會出現的錯誤,請注意。
Note:我一直使用的10.3版本,以下的所有錯誤不對非10.3的版本負責,當然其他版本也差不多。
3.2工具箱名字導致的錯誤
我們先從最簡單的錯誤開始。
工具箱名稱導致的錯誤:
由于輸出路徑會自動填入工具箱的名字,中間有特殊符號的話,比如:“-”,就會報錯。
3.2縮進錯誤
詭異的錯誤來了,報錯顯示如下。我都不知道是說的什么鬼話,怎么還有縮進錯誤?
鎖定到報錯提示的地方,是這樣的:
看上去非常正常,100%正常,開始我不信是這里的問題,我開始折騰,狂寫 print 語句,使勁打斷點,使勁測試,最后機緣巧合之下,我把中文注釋移到了上方,然后就順利運行了。
# ...# 存在該字段else:    # ...
好吧,由于把 else 和中文注釋寫到一行,導致 else 被莫名其妙被跳過了,所以導致錯誤。
3.3兩種“變量”錯誤
第一種:
global name xx is not defined
第二種:
name xx is not defined
這個錯是纏繞我最久的,每次出這種錯誤我都到處測試,偶爾莫名其妙就好了,但是一直不知道原因,直到后來我懷疑是不是也是中文字符造成的錯誤,結果發(fā)現,嘿,還真是!
比如錯誤處的代碼是這樣的,在變量 pta2 的上面是一行中文注釋:
# ...# 二象限pta2 = (oX - length * 2, pta[1])# ...
我們使用空行將報錯的變量和中文注釋隔開:
# ...# 二象限pta2 = (oX - length * 2, pta[1])# ...
于是乎,程序順利運行了,原來如果在變量的上一行是中文注釋,有可能會導致下面那一行被工具箱里面的神奇魔法規(guī)則跳過。
自此,困擾我很久、經常讓我折騰到深夜的各種暗坑終于有了解決方法。
個人的經驗,希望能對你有所幫助和啟發(fā)。
4.最后和總結
總結:
工具箱只是一個箱子,其中需要你自己創(chuàng)建腳本工具來實現各種功能;
腳本工具和 Python 代碼(腳本)兩位一體的,互相配合,腳本工具負責圖形界面,Python 腳本專注于功能的實現,最后在工具箱中將兩者結合起來;
腳本工具添加的圖形界面控件也有多種屬性,最重要的有控制輸入輸出的方向屬性、是否必須的類型屬性,以及其他的偶爾使用的多值、默認等屬性;
GetParameterAsText(index) 方法可從圖形輸入界面獲取參數,不過需要注意的是,返回的結果全部都是字符串,記得轉換如果有必要;
腳本封裝進工具箱報錯多半是由中文引起的,謹記,解決方法參考上文的第三大點。
使用版本:
Windows 10
PyCharm 2021.2.3
ArcGIS 10.3
Python 2.7.8
源代碼、教學文檔離線小冊子下載:
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
arcGIS使用Python腳本工具
在ArcGIS中創(chuàng)建Python工具(一) | kikita & Maps
【轉載】Arcgis自動生成地球化學系列圖-批量克里金
在ArcGis中如何添加腳本或工具??
ArcGis Python腳本
如何在ArcGIS Pro中使用ArcPy調用地理處理工具
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服