劉康晨
(江蘇師范大學(xué)地理測(cè)繪與城鄉(xiāng)規(guī)劃學(xué)院,江蘇徐州 221116)
ArcGIS是美國(guó)ESRI公司在對(duì)其早期開(kāi)發(fā)產(chǎn)品整合的基礎(chǔ)上,于1999年推出的一款可伸縮、全系列GIS平臺(tái),供用戶(hù)選擇使用。從最初的ArcInfo 8發(fā)展到如今的ArcGIS10.7,當(dāng)前ArcGIS主要包括了ArcGIS for Desktop,ArcGIS Server,ArcGIS Online,ArcGIS Enterprise,ArcGISPro等產(chǎn)品。其中,ArcGIS桌面系統(tǒng)是供GIS專(zhuān)業(yè)人員編輯、管理和分析地理信息的軟件套件,可用于完成數(shù)據(jù)編輯、制圖、可視化、地理分析和空間處理等一系列由簡(jiǎn)單到復(fù)雜的GIS任務(wù)[1]。目前的ArcGIS桌面系統(tǒng)主要包括兩大類(lèi):ArcGISfor Desktop,ArcGISPro。在傳統(tǒng)ArcGISfor Desktop中主要包括 ArcMap,ArcCatalog,ArcScene和ArcGlobe四類(lèi)產(chǎn)品,而ArcGISPro在整合傳統(tǒng)ArcGISfor Desktop產(chǎn)品于一體的基礎(chǔ)上,又加入City Engine以提升ArcGIS三維建模能力,在未來(lái)有取代ArcGIS for Desktop的可能。
隨著版本不斷更新,ArcGIS桌面系統(tǒng)功能更加完善,現(xiàn)已成為GIS專(zhuān)業(yè)人員處理地理信息的必備軟件。利用ArcGIS桌面系統(tǒng)處理地理數(shù)據(jù)時(shí)優(yōu)勢(shì)明顯[2-3]:借助其強(qiáng)大的分析工具和擴(kuò)展模塊,可實(shí)現(xiàn)對(duì)地理數(shù)據(jù)方便快捷地處理;同時(shí),憑借其友好地人機(jī)交互界面,用戶(hù)可以對(duì)數(shù)據(jù)快速處理;而軟件本身提供的模板和具備的能力,能極大減少地圖的生產(chǎn)耗時(shí),且在一定程度上實(shí)現(xiàn)地圖生產(chǎn)自動(dòng)化;此外,還可以輕松創(chuàng)建GIS資源,便于信息分享。
ArcGIS桌面系統(tǒng)不僅功能強(qiáng)大,還提供靈活的定制開(kāi)發(fā)方式,用以進(jìn)一步滿(mǎn)足用戶(hù)個(gè)性化需求。如 ArcGIS提供了VBA(Visual Basic for Applications),ArcObjects(簡(jiǎn)稱(chēng) AO),ArcEngine(簡(jiǎn)稱(chēng) AE),Model-Builder,Addin等多種定制擴(kuò)展開(kāi)發(fā)技術(shù)[4-5],供用戶(hù)自主定制開(kāi)發(fā)。在開(kāi)發(fā)過(guò)程中,傳統(tǒng)開(kāi)發(fā)方式更側(cè)重基于VBA,AO或AE的開(kāi)發(fā),而Addin技術(shù)作為新推出的開(kāi)發(fā)技術(shù),目前少有人對(duì)其研究分析。為更好地利用Addin開(kāi)發(fā)技術(shù),實(shí)現(xiàn)對(duì)ArcGIS桌面系統(tǒng)的擴(kuò)展,本文進(jìn)一步對(duì)該種開(kāi)發(fā)方式進(jìn)行解釋說(shuō)明。
Addin通常被譯作插件,是從ArcGIS10開(kāi)始引入的新的桌面定制開(kāi)發(fā)技術(shù)。相較于AO,AE等傳統(tǒng)二次開(kāi)發(fā)方式,Addin具有容易創(chuàng)建、易于安裝、便于共享、更加安全及方便卸載等特性。在開(kāi)發(fā)過(guò)程中,根據(jù)所采用的開(kāi)發(fā)語(yǔ)言不同,可將Addin開(kāi)發(fā)方式具體分為兩種[6]:基于Python腳本語(yǔ)言的Addin技術(shù)、面向.NET(包含C#,VB,C++等)及Java高級(jí)編程語(yǔ)言的Addin技術(shù)。
其中,Python Addin技術(shù)在開(kāi)發(fā)過(guò)程中可直接調(diào)用ArcGIS內(nèi)置的ArcPY站點(diǎn)包,再利用ArcPY站點(diǎn)包實(shí)現(xiàn)對(duì)ArcGIS工具箱中各種工具直接調(diào)用。這既避免了了解復(fù)雜AO組件的難題,又降低了對(duì)開(kāi)發(fā)人員的要求[7]。同時(shí),Python語(yǔ)言簡(jiǎn)潔、寫(xiě)法獨(dú)特的優(yōu)勢(shì),使得在開(kāi)發(fā)過(guò)程中可減少代碼數(shù)量,且不需要編譯。但在這種開(kāi)發(fā)方式下,其編碼不易調(diào)試且可擴(kuò)展元素較少,缺點(diǎn)較為明顯。
同Python Addin技術(shù)相比,面向.NET及Java高級(jí)編程語(yǔ)言的開(kāi)發(fā)方式可支持更多可擴(kuò)展元素。該方式是基于AO組件的擴(kuò)展開(kāi)發(fā),可實(shí)現(xiàn)細(xì)粒度的控制ArcGIS的各種操作。同時(shí),C#作為專(zhuān)為.NET Framework設(shè)計(jì)的一門(mén)面向?qū)ο蟮母呒?jí)編程語(yǔ)言,其語(yǔ)言簡(jiǎn)潔、兼容性強(qiáng)、面向?qū)ο蠹芭cWeb緊密結(jié)合等優(yōu)勢(shì)突出[8],更容易受到開(kāi)發(fā)人員的青睞。
基于C#的Addin開(kāi)發(fā)過(guò)程一般可分為4個(gè)步驟:創(chuàng)建項(xiàng)目、添加組件、編寫(xiě)代碼、調(diào)試安裝。具體開(kāi)發(fā)流程如圖1所示。
圖1 Addin開(kāi)發(fā)流程
打開(kāi)Visual Studio 2010,選擇Desktop Add-Ins模板 ,具 體 有 ArcCatalog Add-in,ArcMap Add-in,ArcScene Add-in及ArcGlobe Add-in四種選擇,在開(kāi)發(fā)過(guò)程中可根據(jù)實(shí)際需要選擇相應(yīng)的模板。隨后,設(shè)置項(xiàng)目名稱(chēng)及其存放位置,并完善相關(guān)描述信息,如項(xiàng)目名稱(chēng)、開(kāi)發(fā)單位、開(kāi)發(fā)人員姓名、插件的用途介紹及插件的圖標(biāo)設(shè)置等。完成后即可點(diǎn)擊Next進(jìn)行下一步設(shè)置。
完善相關(guān)信息后,根據(jù)插件界面設(shè)計(jì)的實(shí)際需要,為該項(xiàng)目添加相應(yīng)組件。Addin中支持的組件類(lèi)型主要有交互類(lèi)和容器類(lèi)兩種[9],具體如圖2所示,且部分交互類(lèi)組件還可依托于容器類(lèi)組件上。為組件添加相應(yīng)的描述信息后,點(diǎn)擊Finish即可實(shí)現(xiàn)項(xiàng)目創(chuàng)建。此外,在完成項(xiàng)目創(chuàng)建后,還可以通過(guò)右擊項(xiàng)目名稱(chēng),選擇“添加”—“組件”方式繼續(xù)添加其他組件元素。
圖2 Addin支持功能類(lèi)型
完成項(xiàng)目創(chuàng)建后,在生成的Config.esriaddinx文件中可查看上述添加的相關(guān)描述信息及組件信息。同時(shí),利用AO及C#語(yǔ)言在組件對(duì)應(yīng)的類(lèi)文件中輸入相應(yīng)代碼,通過(guò)具體的對(duì)象或接口,實(shí)現(xiàn)擴(kuò)展元素相應(yīng)功能及彼此間的交互。
首次對(duì)Addin插件編譯調(diào)試時(shí),需先將其附加到已啟動(dòng)的ArcMap主程序上,具體通過(guò)選擇“工具”-“附加到進(jìn)程”實(shí)現(xiàn)。隨后要先關(guān)閉ArcMap,然后再進(jìn)行反復(fù)調(diào)試。在確保程序正確無(wú)誤后,即可發(fā)布后綴名為.esriAddIn的文件,雙擊文件即可實(shí)現(xiàn)安裝部署,操作簡(jiǎn)單快捷。同時(shí),可通過(guò)ArcMap下的“加載項(xiàng)管理器”直接卸載已安裝的Addin插件,不會(huì)存在注冊(cè)表殘留等問(wèn)題。
當(dāng)前ArcMap面向Geodatabase表或要素類(lèi),將柵格數(shù)據(jù)以屬性形式存儲(chǔ)到字段中時(shí),存在只能人工手動(dòng)逐條加入、不能批量加載的不足。根據(jù)第三章中基于C#的Addin開(kāi)發(fā)步驟,以開(kāi)發(fā)設(shè)計(jì)一個(gè)實(shí)現(xiàn)柵格數(shù)據(jù)批量加載的“ILoader”插件為例,進(jìn)一步闡述基于C#的Addin開(kāi)發(fā)過(guò)程。開(kāi)發(fā)設(shè)計(jì)的插件用戶(hù)界面如圖3所示。
圖3 ILoader工具條界面
“ILoader”插件中包括的具體組件名稱(chēng)及其作用,具體如表1所示。同時(shí),關(guān)于插件的相關(guān)描述性信息及所有的組件元素信息,均可在配置文件Config.esriaddinx中查看,如下所示。
//配置文件Config.esriaddinx信息
//項(xiàng)目描述信息
<Name>ILoader</Name>
<AddInID>{40b44017-99e7-4acf-acb5-5805b96 d111f}</AddInID>
<Description>一個(gè)向Geodatabase表批量加載圖像的工具欄</Description>
<Version>1.0</Version>
<Image>ImagesILoader.png</Image>
<Author>劉康晨</Author>
<Company>JSNU</Company>
<Date>2020/01/01</Date>
<Targets>
<Target name="Desktop"version="10.2"/>
</Targets>
<AddIn language="CLR"library="ILoader.dll"namespace="ILoader">
//組合框C1ComBox相關(guān)信息
<ComboBox id="JSNU_ILoader_C1ComBox"class="C1ComBox"
message="選擇一個(gè)可加載圖像數(shù)據(jù)的目標(biāo)表或要素類(lèi)"caption="表"tip="目標(biāo)表"category="Add-InControls"image="ImagesC1ComBox.png"sizeString="WWWWWWWWWWW"rows="12"itemSizeString="WWWWWWWWWWW"hintText="-------目標(biāo)表-------"editable="true"/>
//工具欄ILoader相關(guān)信息
<Toolbar id="JSNU_ILoader_ILoader"caption="ILoader"showInitially="false">
<Items>
<ComboBoxrefID="JSNU_ILoader_C1ComBox"/>
<ComboBox refID=
"JSNU_ILoader_C2ComBox"separator="true"/>
<ItemrefID=
"JSNU_ILoader_C3Button"separator="true"/>
<Button refID="JSNU_ILoader_C4Button"/>
</Items>
利用該插件進(jìn)行柵格數(shù)據(jù)加載時(shí),首先通過(guò)C1ComBox組合框選擇包含柵格字段的表,通過(guò)C2ComBox組合框選擇一個(gè)字段用于匹配;然后通過(guò)C3Button,C4Button按鈕選擇待匹配的柵格數(shù)據(jù),依次分析其文件名,并將與“匹配字段”中取值匹配的柵格數(shù)據(jù)返回柵格字段中,未匹配的則返回Null,直至處理完所有被選中的數(shù)據(jù)為止。此外,匹配結(jié)果還可通過(guò)C5DWnd可停靠窗口上的DataGridView控件顯示。通過(guò)本插件最終可實(shí)現(xiàn)柵格數(shù)據(jù)的批量加載,完善ArcMap原有功能的不足[10]。
ArcGIS桌面系統(tǒng)作為一個(gè)專(zhuān)業(yè)GIS應(yīng)用軟件套件,其包含的ArcGISfor Desktop及ArcGISPro在各行業(yè)領(lǐng)域的數(shù)據(jù)處理過(guò)程中均得到廣泛應(yīng)用,但其本身在一些功能細(xì)節(jié)上還存在一定不足。目前,針對(duì)ArcGISfor Desktop擴(kuò)展的方法多樣,而利用Addin技術(shù)擴(kuò)展ArcGIS桌面系統(tǒng),不僅降低了開(kāi)發(fā)門(mén)檻,還極大地提高了開(kāi)發(fā)效率。本文主要闡述了基于C#的Addin開(kāi)發(fā)一般流程,并通過(guò)開(kāi)發(fā)實(shí)例具體驗(yàn)證擴(kuò)展插件的優(yōu)越性,希望能為有意愿學(xué)習(xí)Addin開(kāi)發(fā)技術(shù)的人員提供一定借鑒意義。
表1 ILoader組件構(gòu)成