上一篇中我們了解到有兩種方式在 ArcGIS 中創(chuàng)建 Python工具,這一篇就來(lái)看看如何在標(biāo)準(zhǔn)工具箱中創(chuàng)建腳本工具。
ArcGIS Help 中腳本工具的幫助過(guò)于枯燥,在這里,我以一個(gè)具體的實(shí)例來(lái)總結(jié)構(gòu)建腳本工具的過(guò)程,我要實(shí)現(xiàn)的需求是做個(gè)快速實(shí)現(xiàn)羽化邊界效果的小工具,預(yù)期得到如下的效果:
上面效果在ArcMap中完全可以手工運(yùn)行幾個(gè)工具實(shí)現(xiàn),但是過(guò)程稍微繁瑣,那么需求來(lái)了,如何做個(gè)自定的一鍵生成羽化邊界的小工具?
1 準(zhǔn)備Python腳本文件第一步,先寫(xiě)好腳本工具的核心 —— python腳本文件。
腳本中我希望根據(jù)指定環(huán)間距自動(dòng)生成一個(gè)9環(huán)的緩沖面,然后添加一個(gè)字段,用于存儲(chǔ)給各個(gè)緩沖面的透明度百分比。
看下圖就知道我想做什么了:
寫(xiě)一個(gè)py文件,將要用到的工具串聯(lián)起來(lái)實(shí)現(xiàn)自己的需求,大致是下面的樣子。這不是最終要做成腳本工具的版本,只是為了預(yù)先了解要如何實(shí)現(xiàn),后面還要修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 __author__ = 'kikita' # FileName: EasyFeathering.py import arcpy # arcpy.env.workspace = "D:\something\Data.gdb" # Script Tool Parameters InputFeature = "InterestArea" OutputFeature = "OutFeathering" SingleRingWidth = 10000 # Some Predefined Parameters distances = [] level = 9 bufferUnit = "meters" NewField = "Percent" # My Easy Feathering function for i in range(level): distances.append(SingleRingWidth*(i+1)) i = i+1 print str(distances) print "Distance Complete!" arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY") print "Success to execute Multi Ring Buffer." arcpy.AddField_management(OutputFeature,NewField,"double") print "Success to add Transparency Percent Field." arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "") print "Success to Calculate Transparency Percent Field."
2 腳本工具參數(shù)配置有了py文件之后,如何把它塞進(jìn)工具箱里呢?
在ArcMap的Catalog窗口中,找一個(gè)自己喜歡的任意文件夾,新建一個(gè)Toolbox,然后右鍵 Add –> Script,進(jìn)入向?qū)?,這些操作如果不了解,可以點(diǎn) 這里 查查幫助,照著做即可,不贅述。
這里我主要說(shuō)說(shuō)參數(shù)傳遞。
我希望做好的工具中,我只去指定三個(gè)參數(shù),分別是:輸入的興趣區(qū)域面(input Feature ),多環(huán)緩沖的環(huán)間距(Single Ring width ),輸出結(jié)果(output Feature )。預(yù)覽下工具界面:
那么問(wèn)題又來(lái)了,這三個(gè)參數(shù)如何從工具界面?zhèn)鹘o真正執(zhí)行工具的 python 腳本?我們需要對(duì)前面的腳本參數(shù)定義部分做個(gè)修改,使用 arcpy 提供的 GetParameterAsText()
函數(shù)即可在工具界面和腳本之間傳遞參數(shù)。用下面的代碼替換前面對(duì)這三個(gè)參數(shù)的替換:
1 2 3 4 # Script Tool Parameters InputFeature = arcpy.GetParameterAsText(0) SingleRingWidth = arcpy.GetParameterAsText(1) OutputFeature = arcpy.GetParameterAsText(2)
對(duì)應(yīng)的腳本工具參數(shù)配置:
為工具配置參數(shù)的時(shí)候,有2個(gè)原則需要遵守:
工具對(duì)話框中的參數(shù)順序必須與腳本中的參數(shù)順序一致 。
每個(gè)腳本工具參數(shù)都有關(guān)聯(lián)的數(shù)據(jù)類型 。ArcGIS的地理處理不會(huì)將值發(fā)送給數(shù)據(jù)類型不正確的腳本,從這點(diǎn)上看,腳本工具比下一篇要說(shuō)到的腳本工具箱多了一個(gè)優(yōu)勢(shì),就是,在參數(shù)值發(fā)送給腳本之前會(huì)有數(shù)據(jù)類型檢驗(yàn)。
修改Python腳本文件后,現(xiàn)在就運(yùn)行工具,發(fā)現(xiàn)可以得到預(yù)期的結(jié)果:
但是有點(diǎn)不完美,就是在工具的運(yùn)行過(guò)程中,工具給我返回的信息并不充足,我只知道 “Running Script EasyFeathering …”,而不了解工具在做什么,執(zhí)行到了哪個(gè)步驟。這不是好的體驗(yàn)。
3 消息工具和用戶之間的所有溝通均通過(guò)消息來(lái)實(shí)現(xiàn)。接著上一步提出的問(wèn)題,如何在工具進(jìn)度窗口中傳遞消息給用戶?
雖然在開(kāi)始調(diào)試腳本的時(shí)候,如開(kāi)頭代碼所示,我加了些 Print 語(yǔ)句,方便我了解自己的腳本獨(dú)立執(zhí)行時(shí)的狀態(tài),但是如果運(yùn)行腳本工具,這些print語(yǔ)句是看不到的。可以使用 ArcPy中提供的有關(guān)消息的函數(shù),AddMessage
、AddWarning
、AddError
等向工具進(jìn)度條界面發(fā)送消息。這里我做了個(gè)簡(jiǎn)單的步驟的消息性提示,以及,如果結(jié)果沒(méi)有記錄輸出,會(huì)提示警告。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 __author__ = 'kikita' # FileName: EasyFeathering.py import arcpy #arcpy.env.workspace = "D:\IncidentSupport2015\something\Data.gdb" # Get the input values from tool UI InputFeature = arcpy.GetParameterAsText(0) SingleRingWidth = arcpy.GetParameterAsText(1) OutputFeature = arcpy.GetParameterAsText(2) # Some Predefined Parameters distances = [] level = 9 bufferUnit = "meters" NewField = "Percent" # My Easy Feathering function for i in range(level): distances.append(int(SingleRingWidth)*(i+1)) i = i+1 arcpy.AddMessage("Step1 Distance list Complete!") arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY") arcpy.AddMessage("Step2 Success to execute Multi Ring Buffer.") arcpy.AddField_management(OutputFeature,NewField,"double") arcpy.AddMessage("Step3 Success to add Transparency Percent Field.") arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "") InputFeatureCount = int(arcpy.GetCount_management(OutputFeature).getOutput(0)) if InputFeatureCount == 0: arcpy.AddWarning("{0} has no features.".format(OutputFeature)) else: arcpy.AddMessage("Step4 Success to Calculate Transparency Percent Field.")
這樣在工具的執(zhí)行過(guò)程中,我就收到了消息:
到這里,工具的功能部分就完成了。
4 顯示結(jié)果圖層 我進(jìn)一步希望腳本工具運(yùn)行之后,自動(dòng)顯示在當(dāng)前的地圖文檔中,從而避免重復(fù)設(shè)置透明度的操作。
為輸出參數(shù)配置模板圖層。
在處理設(shè)置中,激活設(shè)置
這樣在運(yùn)行工具之后,結(jié)果即自動(dòng)添加顯示。
5 配置路徑如果是在本機(jī)使用腳本工具,一般我們會(huì)使用絕對(duì)路徑,但是如果希望分享自己的工具給別人,就要考慮路徑問(wèn)題,也就是新用戶運(yùn)行腳本工具時(shí),相關(guān)的腳本文件和其他用到的資源能否訪問(wèn)到。我的工具按照如下的結(jié)構(gòu)組織:
在腳本工具的屬性中,可以配置存儲(chǔ)相對(duì)路徑引用 py 文件:
PS:但是不要想太多,這個(gè)設(shè)置僅僅會(huì)將腳本文件所在位置按照相對(duì)路徑存儲(chǔ),而不會(huì)將腳本內(nèi)部的路徑進(jìn)行轉(zhuǎn)換。
這個(gè)示例中我還需要用到一個(gè)圖層文件作為模板,如果希望使用相對(duì)路徑使用,就建議將符號(hào)化信息寫(xiě)在腳本內(nèi)部,而不是在參數(shù)窗口中配置。所以,要繼續(xù)修改下Python腳本文件。
在腳本文件的最后追加兩行代碼,我這里將獲取與Python腳本文件在相同目錄下的lyr文件:
1 2 3 4 5 6 7 # Layer files are located in same folder as the .py file PythonFilePath = os.path.dirname(__file__) params = arcpy.GetParameterInfo() params[2].symbology = os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr") # Pass message arcpy.AddMessage("Finding Feathering Effect Template Layer ..." +"/n"+ os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr"))
OK,路徑的問(wèn)題就解決了。
6 幫助文檔還可以進(jìn)一步為工具添加幫助文檔,讓更多的人了解如何使用這個(gè)工具。
在ArcCatalog 或者ArcMap的Catalog 中,在腳本工具上右鍵,點(diǎn)擊 Item Description 菜單,點(diǎn)擊 Edit 就可以對(duì)工具的幫助文檔進(jìn)行編輯。
這樣當(dāng)別人打開(kāi)你的工具時(shí),就看到幫助嘍。
好啦,關(guān)于ArcGIS 中使用腳本工具的過(guò)程就說(shuō)到這里。