ArcGIS添加工具

在規(guī)劃類工程項(xiàng)目中,經(jīng)常要輸出縣級(jí)或者各個(gè)鄉(xiāng)鎮(zhèn)的各種規(guī)劃圖。以前的做法是一副一副打開后單個(gè)輸出,費(fèi)時(shí)費(fèi)力,而且輸出速度較慢。學(xué)習(xí)了Python之后,一直想為還奮戰(zhàn)在規(guī)劃一線的碩士辦公室的學(xué)弟學(xué)妹們寫一個(gè)批量輸出JEPG的程序,節(jié)省精力和體力。可總是各種拖延,沒(méi)有付諸行動(dòng)。今早刷朋友圈,看到一個(gè)師妹的狀態(tài)說(shuō)昨晚又在熬夜出項(xiàng)目圖,那種辛苦我感同身受。作為大師兄的我,責(zé)任感爆棚,打敗拖延癥,寫出人生第一個(gè)集成在ArcGIS中的TOOL。

Python 核心程序

該工具利用ARCPY站點(diǎn)包寫成,核心函數(shù)是arcpy.mapping.ExportToJPEG,arcpy.mapping 提供了許多與自動(dòng)化地圖生產(chǎn)相關(guān)的功能,輸出JPEG是提供的導(dǎo)出圖片功能之一。
另外一個(gè)函數(shù)是,arcpy.GetParameterAsText()。arcpy.GetParameterAsText()函數(shù)并非獲取信息傳遞給腳本的唯一方式。當(dāng)你從命令行調(diào)用Python腳本,你可以傳遞一組參數(shù)(argument)。當(dāng)向腳本傳遞參數(shù)時(shí),每個(gè)參數(shù)必須使用空格隔開。這些參數(shù)保存在一個(gè)基于sys.argv的列表對(duì)象中。使用sys.argv引用索引值0來(lái)引用列表中的第一個(gè)元素,該元素用于保存腳本名稱。每一個(gè)后續(xù)的參數(shù)索引值依次遞增加1。因此,第一個(gè)參數(shù)保存在sys.argv[1]中,第二個(gè)參數(shù)保存在sys.argv[2]。這些參數(shù)可以通過(guò)腳本來(lái)獲取。
建議大家使用GetParameterAsText()函數(shù),這是因?yàn)榍罢邲](méi)有字符數(shù)量的限制而后者則要求每個(gè)參數(shù)要小于1024個(gè)字符。不管使用哪種方式,參數(shù)讀入后,腳本會(huì)作為輸入值繼續(xù)執(zhí)行。
完整代碼如為:

# -*- coding: utf-8 -*-

import arcpy
import sys
#reload(sys)
import os
#sys.setdefaultencoding( "utf-8" )
# infiles = arcpy.GetParameterAsText(0)
infiles = arcpy.GetParameterAsText(0).split(';')
#print infiles
# xx = raw_input("xx")
outdir = arcpy.GetParameterAsText(1)
resolutionValue = arcpy.GetParameterAsText(2)
#print infiles
#outdir11 = outdir.split("\")
#outdir = os.path.join(outdir11)
try:
    for infile in infiles:
        #infile = os.path.join(infile.split("\"))
        mxd = arcpy.mapping.MapDocument(infile)
        name = os.path.split(infile)[1].split(".")[0]+".jpg"
        outfile = os.path.join(outdir,name)
        # df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
        arcpy.mapping.ExportToJPEG(mxd, outfile, resolution = resolutionValue)
        del mxd
except arcpy.ExecuteError:
    print arcpy.GetMessages()
    # xx = raw_input("xx")    
    
 #E:\Landsat\Processing\MXDExportToJEPG.py  "E:\\Landsat\\Processing\\Analysis\\comt.mxd" "E:\\Landsat\\Processing\\Analysis" "300"

創(chuàng)建自定義ARCTOOLS

自定義arctoolbox的過(guò)程可以參考
1.右鍵單擊ArcToolbox內(nèi)的任何空白位置,選擇添加工具箱(Add Toolbox)。在Add Toolbox對(duì)話框中,點(diǎn)擊New Toolbox按鈕。系統(tǒng)會(huì)創(chuàng)建一個(gè)Toolbox.tbx
的工具箱,在下一步中你可以重命名該工具箱:


2.轉(zhuǎn)到C:\ArcpyBook\Ch7
文件夾,在該文件夾下創(chuàng)建一個(gè)Wildfire Tools
的工具箱:

3.選中Wildfire Tools.tbx
文件然后點(diǎn)擊打開(Open)按鈕。如下圖所示,該工具箱就出現(xiàn)在ArcToolbox窗口中了:

4.每一個(gè)工具箱都需要給定一個(gè)名稱和別名。別名可以用于唯一識(shí)別你的自定義工具。別名應(yīng)該盡量簡(jiǎn)短且不包含特殊字符。右鍵單擊新添加的工具箱選擇屬性(Properties)。如下圖所示添加一個(gè)wildfire
的別名:

此外,還可以右鍵單擊工具箱選擇新建|工具集(New|Toolset)在工具箱中創(chuàng)建一個(gè)新的工具集。工具集可以按照功能來(lái)對(duì)腳本進(jìn)行分組。在本案例中,你不需要這么做,不過(guò)如果在以后需要對(duì)腳本進(jìn)行分組管理時(shí),你就可以通過(guò)創(chuàng)建工具集來(lái)完成。
接下來(lái),我們將腳本添加到剛剛創(chuàng)建的Wildfire Tools工具箱中。
5.在ArcToolbox中,右鍵單擊之前創(chuàng)建的Wildfire Tools工具箱,選擇添加|腳本(Add|Script)。如下圖所示彈出添加腳本(Add Script)對(duì)話框。填寫腳本名稱,標(biāo)簽以及描述信息。名稱(Name)中不能包含空格以及特殊字符。標(biāo)簽(Label)信息為腳本工具的顯示名稱。本案例中,標(biāo)簽設(shè)置為MXDExportToJPEG
文本。最后,添加一些描述信息來(lái)說(shuō)明腳本執(zhí)行的細(xì)節(jié)等。
6.名稱標(biāo)簽描述的細(xì)節(jié)信息如下圖所示:

特別注意:要勾選store relative path names,否則不能移到其它機(jī)器

7.點(diǎn)擊下一步(Next)按鈕顯示添加腳本的下一個(gè)對(duì)話框。
8.在該對(duì)話框中,你需要制定需要添加到工具中的腳本文件。選擇MXDExportToJPEG.py
腳本文件。
9.還需要勾選在進(jìn)程中運(yùn)行Python腳本(Run Python Script in process)。在進(jìn)程中運(yùn)行腳本會(huì)提高腳本執(zhí)行的速度。


進(jìn)程外運(yùn)行Python腳本需要ArcGIS創(chuàng)建一個(gè)單獨(dú)的進(jìn)程來(lái)執(zhí)行腳本。開啟進(jìn)程和執(zhí)行腳本的時(shí)間會(huì)導(dǎo)致腳本運(yùn)行性能的問(wèn)題。通常都選擇在進(jìn)程中運(yùn)行Python腳本。在進(jìn)程中運(yùn)行腳本意味著ArcGIS不需要開啟第二個(gè)進(jìn)程來(lái)運(yùn)行腳本,腳本與ArcGIS運(yùn)行在同一個(gè)進(jìn)程中。
10.點(diǎn)擊下一步(Next)顯示參數(shù)窗口,如下圖所示:

你在該對(duì)話框中輸入的每一個(gè)參數(shù)都要與一個(gè)單獨(dú)的GetParameterAsText()
函數(shù)調(diào)用相關(guān)聯(lián)。在前面,我們已經(jīng)修改過(guò)腳本使其接受通過(guò)GetParameterAsText()
函數(shù)獲取的動(dòng)態(tài)參數(shù)。該對(duì)話框中參數(shù)的輸入的順序應(yīng)該與腳本中指定接受的順序一致。比如,你在腳本中插入了下面的代碼:
infiles = arcpy.GetParameterAsText(0)
那么你在參數(shù)對(duì)話框中添加的第一個(gè)參數(shù)就需要與該行代碼關(guān)聯(lián)。在腳本中,outputFC
參數(shù)代表運(yùn)行腳本后創(chuàng)建的要素類。你通過(guò)點(diǎn)擊顯示名稱(Display Name)下的第一行來(lái)添加參數(shù)。你可以在該位置輸入任意文本,該文本會(huì)顯示給用戶。你還需要選擇與該參數(shù)相關(guān)聯(lián)的數(shù)據(jù)類型。在本案例中,數(shù)據(jù)類型(Data Type)應(yīng)該選擇要素類(Feature Class)。每一個(gè)參數(shù)都有一些屬性可以設(shè)置。其中比較重要的屬性包括類型(Type)方向(Direction)以及默認(rèn)值(Default)。

特別注意:對(duì)話框中的MultiValue 為多值選項(xiàng),如選擇,則可以添加多個(gè)屬性值,如本例中的添加多個(gè)MXD工程文檔。但在程序中,接受該屬性的類型為一個(gè)字符串,也就是以“;”分割的一個(gè)字符串,而不是List,從而不能對(duì)其直接操作。要用infiles = arcpy.GetParameterAsText(0).split(';')方法將每個(gè)文件分割開,才能進(jìn)行下一步的操作。記住,這可能是個(gè)大坑??!

設(shè)置密碼,發(fā)布工具

怎樣將工具發(fā)布給他人使用,又不能看到腳本代碼?如果編輯調(diào)試完成了,在腳本工具右鍵可導(dǎo)入腳本。


設(shè)置密碼后,即可。

必須注意的是:整個(gè)代碼中不能有中文字符,否則,不能正常導(dǎo)入腳本,發(fā)布出去的腳本工具就有問(wèn)題。
然后將上文在工具箱中新建的.tlbx文件復(fù)制給他人就可以使用了。

結(jié)語(yǔ):

懶得寫添加的具體步驟和截圖,所以引用了ArcGIS Python編程案例中的創(chuàng)建TOOls的步驟和ArcGIS使用Python腳本工具中設(shè)置密碼的步驟。對(duì)于其中一些關(guān)鍵的或者我出錯(cuò)的步驟做了一個(gè)說(shuō)明,權(quán)當(dāng)學(xué)習(xí)筆記了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容