第十章 獲取GIS數(shù)據列表和描述信息 ||| 第十二章 異常和錯誤處理
我們將在本章介紹以下幾個案例:
- 下載安裝Python加載項
- 創(chuàng)建按鈕加載項
- 安裝測試加載項
- 創(chuàng)建工具加載項
引言
本章中我們會介紹如何創(chuàng)建劫流,測試,編輯和共享Python編寫的加載項。加載項是通過一組設計好的模塊化代碼庫向ArcGIS桌面軟件中添加用戶界面組件的方式來執(zhí)行特定操作芥被。界面組件包括按鈕审葬,工具淫茵,工具條茶宵,菜單桐汤,組合框垢夹,工具選項板以及應用程序擴展溢吻。加載項的概念是在ArcGIS 10.0版本中引入的,由.NET或Java來編寫果元。在ArcGIS 10.1版本中加載項可以使用Python來創(chuàng)建促王。使用Python腳本和XML文件來創(chuàng)建加載項,其中XML文件定義了加載項在用戶界面的外觀顯示而晒。
加載項提供了一種向最終用戶分發(fā)自定義用戶界面的簡便方式成箫。不需要安裝程序谬俄。只要將一個擴展名為.esriaddin
的壓縮文件復制到一個已知文件夾中,其他工作交給ArcGIS來處理。為了能夠進一步簡化開發(fā)過程击敌,ESRI還提供了一個Python加載項向導。你可以從Esri官網下載安裝向導内列。這也是本章要介紹的第一個案例寄啼。
我們還可以創(chuàng)建多個類型的加載項。按鈕和工具是最為簡單的加載項钠乏。點擊按鈕來執(zhí)行業(yè)務邏輯操作栖秕。工具與按鈕非常相似,不過工具需要先與地圖窗口進行交互后再執(zhí)行業(yè)務邏輯操作晓避。組合框則提供了選項列表讓用戶進行選擇簇捍。
我們還可以創(chuàng)建一些容器對象類型加載項,包括菜單俏拱,工具條暑塑,工具選項卡以及應用程序擴展。菜單是按鈕或其他菜單的容器锅必。工具條是按鈕事格,工具,組合框,工具選項板以及菜單的容器分蓖。菜單和工具條是最為靈活的加載項容器類型尔艇。工具選項板作為工具的容器,不過需要事先添加到工具條中么鹤。應用程序擴展是最為復雜的加載項類型终娃,用于協(xié)調加載項中其他組件的活動并負責監(jiān)聽和響應應用程序的各種事件,比如從數(shù)據庫中添加或移除圖層事件等蒸甜。
下載安裝Python加載項向導
ESRI提供了一個Python加載項向導工具來簡化加載項開發(fā)過程棠耕。該工具可以從ESRI官網上下載,這也是創(chuàng)建加載項一種很好的方式柠新。
Getting ready
Python加載項向導工具是用來創(chuàng)建加載項中所要文件很好的方式窍荧。該工具通過一個可視化的界面來創(chuàng)建加載項中所需的文件。在本案例中恨憎,你要下載并安裝Python加載項向導蕊退。
How to do it...
按照以下步驟來學習如何下載安裝Python加載項向導工具:
1.打開瀏覽器轉至Python加載項向導工具頁面。
如下圖所示憔恳,你看到如下頁面:
2.點擊下載(Download)按鈕下載安裝文件瓤荔。
3.在電腦的任意位置創(chuàng)建一個新的文件夾,并命名為Python Add-In Wizard
钥组。文件夾的名稱不重要输硝,這里只不過便于記憶,你可以使用Python Add-In Wizard
或其他名稱程梦。
4.將安裝文件解壓到剛創(chuàng)建的文件夾中点把。
5.打開解壓后的bin
文件夾,雙擊addin_assisant.exe
文件執(zhí)行安裝向導程序屿附。如下圖所示:
6.雙擊addin_assiant.exe
后會提示你選擇一個目錄作為加載項項目的根目錄:
How it works...
Python加載項向導是一個用來創(chuàng)建ArcGIS桌面軟件的加載項的可視化的工具郎逃。該工具通過點擊操作大大簡化了開發(fā)過程。在下一個案例中拿撩,你就要使用該向導工具來創(chuàng)建簡單的ArcGIS桌面軟件加載項衣厘。
創(chuàng)建按鈕加載項
按鈕加載項是最簡單也是最為常用的類型。使用按鈕加載項压恒,點擊一次按鈕就會執(zhí)行一次腳本中的功能操作影暴。
Getting ready
創(chuàng)建一個新加載項的第一步就是創(chuàng)建一個加載項項目。使用Python加載項向導工具創(chuàng)建項目探赫,你首先需要選擇一個工作目錄型宙,然后輸入多個項目設置最后點擊保存(Save)按鈕。創(chuàng)建加載項的過程按照已定義的流程進行伦吠,如下圖所示:
你需要首先創(chuàng)建一個加載項的容器妆兑,該容器可以是工具條也可以是菜單魂拦。接下來創(chuàng)建需要添加到容器中的按鈕,工具或其他加載項搁嗓。在本案例中芯勘,我們只創(chuàng)建一個按鈕加載項。接下來腺逛,你需要編輯與按鈕關聯(lián)的Python腳本文件荷愕。你還需要測試按鈕來確保其工作正常。最后棍矛,你還可以將加載項共享給其他人安疗。在本案例中,你將學習如何使用加載項向導工具來創(chuàng)建一個ArcGIS桌面軟件的按鈕加載項够委。該按鈕將會執(zhí)行你在之前的案例中創(chuàng)建的一個自定義腳本工具荐类,該工具會從文本文件中導入火情數(shù)據并轉成一個點要素類。
How to do it...
按照以下步驟來學習如何創(chuàng)建一個按鈕加載項:
1.雙擊addin_assistant.exe
文件打開Python加載項向導茁帽。
2.創(chuàng)建一個新的項目文件夾玉罐,并命名為Wildfire_Addin
然后點擊OK按鈕。
3.項目設置(Project Settings)選項卡會首先被激活脐雪,并顯示剛才創(chuàng)建的工作目錄厌小。默認情況下,ArcMap是被選擇的產品战秋,你可以確認一下:
4.項目命名。我們在這里命名為Load Wildfire Data Addin
:
5.默認情況下讨韭,版本號為0.1
脂信。你可以修改為你喜歡的版本號。版本號隨著工具的更新或功能增加應該也隨著改變透硝。這將會有助于加載項的追蹤和共享狰闪。
6.名稱和版本屬性是僅有的兩個必選屬性。但是添加單位濒生,說明和作者信息是一個好的習慣埋泵。如下圖所示添加你自己的相關信息:
7.你或許還希望給加載項添加一個圖片。你可以在C:\ArcpyBook\Ch11
文件中找到wildfire.png
圖片文件:
8.加載項內容(Add-In Content)選項卡用于定義要創(chuàng)建的多種加載項罪治。在這一步驟中丽声,我們會創(chuàng)建一個工具條來放置按鈕加載項用于執(zhí)行腳本。點擊加載項內容(Add-In Content)選項卡:
9.在加載項內容(Add-In Content)選項卡中觉义,右鍵單擊工具條(Toolbars)選擇新工具條(New Toolbars)雁社。設置工具條的標題,默認ID并勾選初始化顯示(Show Initially)復選框:
工具條加載項雖然不提供任何功能操作晒骇,但作為像按鈕霉撵,工具磺浙,組合框,工具選項板以及菜單等加載項的容器是非常的重要徒坡。工具條可以浮動或固定撕氧。使用Python加載項向導創(chuàng)建一個工具條加載項非常方便。
10.點擊保存(Save)按鈕喇完。
11.現(xiàn)在呵曹,右鍵單擊Wildfire Toolbar選項選擇新按鈕(New Button)來添加一個按鈕:
12.輸入按鈕標題,類名何暮,ID奄喂,工具提示等其他細節(jié)信息。你還可以指定按鈕控件的圖像海洼。我在本案例中沒有指定圖像跨新,不過你可以嘗試一下。這些信息將會保存到加載項配置文件中:
13.點擊保存(Save)按鈕坏逢。
加載項需要一個與之關聯(lián)的Python腳本文件域帐。該文件默認情況下被命名為WildfireAddin_addin.py
,該文件位于工作項目文件夾下的install
目錄下是整。
14.我們之前已經創(chuàng)建了一個自定義的ArcToolbox腳本工具來加載一個逗號分隔的文本文件并將火情數(shù)據轉成要素類肖揣。我們將在加載項中使用該腳本。在Windows資源管理器中找到你之前創(chuàng)建的加載項目錄浮入。打開Install
文件夾找到WildfireAddin_addin.py
龙优,并在Python編輯器中打開。
15.找到onClick(self)
方法事秀。點擊按鈕后觸發(fā)該方法:
import arcpy
import pythonaddins
class ButtonClassImportWildfires(object):
"""Implementation for WildfireAddIn_addin.button (Button)"""
def __init__(self):
self.enabled = True
self.checked = False
def onClick(self):
pass
16.移除onClick
事件中的pass
語句彤断。
17.第七章創(chuàng)建自定義地理處理工具中我們創(chuàng)建了一個自定義腳本工具從文本文件中導入火情數(shù)據并轉成要素類。在onClick
事件中調用該腳本工具易迹,這樣該工具會出現(xiàn)在用戶界面中來執(zhí)行選擇文本文件宰衙,模板和要素類操作:
def onClick(self):
pythonaddins.GPToolDialog(r'c:\arcpybook\ch7\WildfireTools.tbx', 'LoadWildfires')
18.保存文件。
在下一個案例中睹欲,你會學習如何安裝新的加載項供炼。
How it works...
正如在案例中一樣,Python加載項向導通過一個可視化界面來執(zhí)行加載項的創(chuàng)建流程窘疮。然而在這后面袋哼,向導工具創(chuàng)建了加載項有關的一系列文件夾和文件。加載項文件結構相當簡單考余。兩個文件夾以及一系列文件構成了加載項文件結構先嬉,如下圖所示:
Images
文件夾中包含了加載項所用到的所有圖標和圖像文件。在本案例中楚堤,我們使用了wildfire.png
文件疫蔓,現(xiàn)在該文件應該位于Images
文件夾中含懊。Install
文件夾包含了用于執(zhí)行加載項業(yè)務邏輯的腳本文件。你會經常處理此類文件來編寫加載項衅胀。腳本文件來執(zhí)行那些需要通過按鈕岔乔,工具,菜單項來執(zhí)行的業(yè)務邏輯滚躯。加載項主文件中的config.xml
文件定義了用戶界面和所有靜態(tài)屬性雏门,比如名稱,作者掸掏,版本等信息茁影。雙擊makeaddin.py
會創(chuàng)建一個.esriaddin
文件,該文件打包壓縮了所有的文件丧凤。該文件將會分發(fā)給最終用戶來安裝加載項募闲。
安裝并測試加載項
在分發(fā)加載項給最終用戶前,你需要測試這些加載項愿待。進行測試前需要安裝這些加載項浩螺。
Getting ready
在加載項工作目錄下,makeaddin.py
腳本用于將工作目錄下的所有文件和文件夾打包壓縮到一個<working folder name>.esriaddin
形式的文件中仍侥。雙擊該.esriaddin
文件打開ESRI ArcGIS加載項安裝工具來安裝你的加載項要出。之后你就可以在ArcGIS桌面軟件中測試安裝的加載項。自定義的工具條或菜單可能已經出現(xiàn)在界面中农渊。如果沒有顯示顯示患蹂,在自定義(Customize)菜單下點擊加載項管理器(Add-in Manager)。加載項管理器(Add-in Manager)對話框列出了針對當前應用程序下安裝的所有加載項腿时。名稱况脆,描述和圖片等這些在項目設置中輸入的加載項信息都會看到。
How to do it...
按照以下步驟來學習如何安裝并測試加載項:
1.你的加載項主文件夾下會有一個makeaddin.py
的Python腳本文件批糟。該腳本用于創(chuàng)建.esriaddin
文件。雙擊該腳本運行創(chuàng)建一個.esriaddin
文件看铆。如下圖所示:
2.雙擊Wildfire_Add-In.esriaddin
文件徽鼎,如下圖所示打開Esri ArcGIS加載項安裝工具窗口來安裝加載項:
3.點擊安裝加載項(Install Add-In)按鈕。如果一切順利弹惦,你會看到如下圖所示消息:
4.打開ArcMap來測試加載項否淤。你的加載項已經被激活。如果沒有激活棠隐,選擇自定義|加載項管理器(Customize|Add-In Manager)石抡。如下圖所示顯示加載項管理器對話框。你會看到你安裝的加載項:
5.如果有必要助泽,選擇自定義(Customize)按鈕啰扛。點擊工具條(Toolbars)選項卡選擇你創(chuàng)建的工具條并添加到程序界面中:
How it works...
安裝工具會將加載項安裝到默認的加載項文件夾中嚎京。默認位置如下:
- Vista/7:
C:\Users\<username>\Documents\ArcGIS\AddIns\Desktop10.1
- XP:
C:\Documents and Settings\<username>\My Documents\ArcGIS\AddIns\Desktop10.1
如下圖所示,在默認的加載項文件夾下會創(chuàng)建一個以全局唯一識別符(GUID)命名的子文件夾隐解。加載項就位于該文件夾中鞍帝。當ArcGIS桌面軟件啟動時,程序就會搜索這些文件并導入加載項:
加載項文件如下圖所示:
默認的加載項文件夾位于你的用戶賬號中的ArcGIS文件夾中煞茫。比如帕涌,如果你安裝的是ArcGIS 10.1版本,Vista或Window7操作系統(tǒng)中的默認加載項文件夾路徑為
C:\user\<username>\Documents\ArcGIS\Addins\Desktop10.1
续徽。
你還可以使用一個專用網絡驅動器來為用戶分發(fā)加載項蚓曼。ArcGIS桌面軟件中的加載項管理器添加并維護用于搜索加載項的文件夾列表。在加載項管理器對話框中選擇選項(Option)選項卡之后點擊添加文件夾(Add Folder)來添加一個網絡驅動器到列表中钦扭。
創(chuàng)建工具加載項
工具加載項與按鈕非常相似纫版,只不過工具需要與地圖窗口進行某些交互操作。舉個例子土全,ArcMap中的放大工具就是一個典型示例捎琐。工具需要位于在工具條或工具選項板中。工具加載項屬性與按鈕基本一樣裹匙。也需要編輯Python腳本瑞凑。
Getting ready
工具類包含的屬性有光標(cursor
),可用性(enabled
)以及形狀(shape
)概页。光標屬性集用來設置工具點擊時光標的類型籽御,如下圖所示,使用整數(shù)值來定義相對應的光標類型:
默認情況下惰匙,工具都是可用的技掏。不過可以將工具的enabled
屬性設置為false
,則會更改工具的可用性项鬼。最后shape
屬性指定了在地圖上繪制的形狀類型哑梳,包括線,矩形或圓形绘盟。這些屬性通常是在工具的構造函數(shù)中調用_init_
函數(shù)來設置鸠真,如下代碼示例所示。self
變量指向當前對象(這里指工具):
def _init_(self):
self.enabled = True
self.cursor = 3
self.shape = 'Rectangle'
工具類中還支持許多相關的函數(shù)龄毡。所有類都包含一個構造函數(shù)用于定義該類的屬性吠卷。你前面看到的_init_
函數(shù)就是一個例子。工具中其他重要的函數(shù)包括onRectangle()
沦零,onCircle()
以及onLine()
祭隔。這些函數(shù)與要繪制到地圖中的形狀有關聯(lián)。繪制的形狀的幾何參數(shù)會傳遞給這些函數(shù)路操。還有一些鼠標和鍵盤操作有關的函數(shù)疾渴。最后調用deactivate()
函數(shù)使工具處于非活動狀態(tài)千贯。
_init_
函數(shù)用于設置工具的多個屬性。在這里程奠,我們解釋下工具類中的onRectangle()
函數(shù)丈牢。當在地圖中繪制矩形的時候調用該函數(shù)。矩形的幾何參數(shù)傳遞給函數(shù)瞄沙,同時引用當前工具:
def onRectangle(self,rectangle_geometry):
在本案例中己沛,你會學習如何創(chuàng)建一個工具加載項可以讓用戶在地圖中繪制矩形并在矩形范圍內生成隨機點。
How to do it...
按照以下步驟使用Python加載項向導創(chuàng)建一個工具加載項:
1.雙擊addin_assistant.exe
文件打開ArcGIS加載項向導距境。
2.創(chuàng)建一個新項目文件夾并命名為Generate_Random_Points
申尼,然后點擊OK。
3.在項目設置(Project Settings)選項卡中輸入名稱垫桂,版本师幕,單位,描述和作者屬性信息:
4.點擊加載項內容(Add-In Content)選項卡诬滩。
5.右鍵單擊工具條(Toolbars)選擇新工具條(New Toolbars)霹粥。
6.工具條標題設置為Random Points Toolbar
。
7.右鍵單擊新創(chuàng)建的Random Points Toolbar
工具條選擇新工具(New Tool)疼鸟。
8.如下圖所示輸入工具的信息:
9.點擊保存(Save)按鈕后控。向導工具會生成加載項文件夾和文件。
10.打開新加載項工作目錄中的Install
文件夾空镜,使用IDLE打開Generate_Random_Points_addin.py
文件浩淘。
11.添加以下代碼:
def _init_(selft):
self.enabled = True
self.cursor = 3
self.shape = 'Rectangle'
12.在onRectangle()
函數(shù)中添加代碼實現(xiàn)在繪制到地圖中的矩形內部生成隨機點:
def onRectangle(self,rectangle_geometry):
extent = rectangle_geometry
arcpy.env.workspace = r"C:\ArcpyBook\Ch11"
if arcpy.Exists('randompts.shp'):
arcpy.Delete_management('randompts.shp')
randompts=arcpy.CreateRandomPoints_management(arcpy.env.workspace, 'randompts.shp',"",extent)
arcpy.RefreshActiveView()
return randompts
13.保存文件。
14.雙擊makeaddin.py
文件生成esriaddin
文件吴攒。
15.雙擊Generate_Random_Points.esriaddin
文件安裝加載項张抄。
16.打開ArcMap,如有必要添加Generate Random Points
工具條洼怔。
17.在地圖中繪制一個矩形來測試加載項署惯。輸出結果如下圖所示。你的地圖顯示結果由于點位置的隨機性分布會有所不同:
How it works...
工具加載項與按鈕非常相似镣隶,區(qū)別在于工具加載項需要先與地圖窗口進行某些交互后才會觸發(fā)工具執(zhí)行操作泽台。地圖交互包括點擊地圖,繪制多邊形或矩形或者各種鼠標和鍵盤事件矾缓。你可以編寫Python代碼來響應一個或多個交互事件。在本案例中稻爬,你學習了如何編寫代碼來響應onRectangle()
事件嗜闻。你還在加載項構造函數(shù)中設置了光標(cursor
)和形狀(shape
)屬性,其中形狀(shape
)屬性指定地圖中要繪制的圖形形狀桅锄。
There's more...
你還可以創(chuàng)建許多加載項琉雳。組合框加載項提供了可供用戶選擇的下拉值列表样眠,用戶還可以選擇輸入新值來編輯列表內容。同其他加載項一樣翠肘,你也需要首先使用Python加載項向導創(chuàng)建一個新項目檐束,然后添加一個新工具條,之后在工具條中添加一個組合框束倍。
工具選項板提供了對相關工具進行分組的方式被丧。該加載項也需要添加到一個已有工具條中。默認情況下绪妹,工具選項板中的工具是格網狀顯示甥桂。
菜單加載項作為按鈕和其他菜單的容器。菜單除了可以通過ArcGIS桌面軟件中的加載項管理器中顯示邮旷,也可以顯示在自定義(Customize)對話框中黄选。
應用程序擴展用于向ArcGIS桌面軟件中添加特定的相關功能工具集。比如Spatial Analyst
婶肩,3D Analyst
以及Bussiness Analyst
等办陷。通常應用程序擴展負責監(jiān)聽并響應事件。比如說律歼,你創(chuàng)建一個應用程序擴展在用戶每次添加一個圖層時保存地圖文檔文件民镜。應用程序擴展還可以協(xié)調組件之間的活動。