丘國(guó)文
(福建省上杭縣林業(yè)局,福建杭州364200)
理解ArcObjects對(duì)象模型,編寫林業(yè)規(guī)劃功能程序*
丘國(guó)文
(福建省上杭縣林業(yè)局,福建杭州364200)
理解ArcObjects常用對(duì)象模型,掌握其接口、屬性和方法,目的在于編寫程序,擴(kuò)展ArcMap潛在功能,高效、準(zhǔn)確實(shí)現(xiàn)林業(yè)規(guī)劃及圖層修正更新工作。
林業(yè)規(guī)劃;ArcMap;ArcObjects對(duì)象模型;編程
目前,ArcGIS已成為林業(yè)制圖軟件的主流產(chǎn)品,雖然它有豐富的系統(tǒng)工具,但還是滿足不了不同行業(yè)個(gè)性化的需求,若要在不同圖層之間分析的工作,即使能利用其系統(tǒng)工具,有時(shí)不能一步做成,還需要生成許多中間圖層逐步過(guò)渡才能做出來(lái)。ArcMap嵌入了VBA后結(jié)合ArcObjects,也能象Word、Excel、Access中的VBA一樣,很方便定制ArcGIS里的應(yīng)用工具,彌補(bǔ)其系統(tǒng)工具功能的不足。ArcObjects是ArcGIS的開(kāi)發(fā)臺(tái),ArcObjects建立在微軟的組件對(duì)象模型(Component Object Model,COM)技術(shù)之上,是微軟產(chǎn)品中系列中的通用編程語(yǔ)言。VBA(Visual Basic for Applications)是支持COM的編程語(yǔ)言。本文結(jié)合“省級(jí)以上重點(diǎn)生態(tài)公益林區(qū)位圖繪制”工作實(shí)例,基于VBA的ArcObjects編程,探尋實(shí)現(xiàn)兩層之間的空間選擇新方法。
1、林業(yè)基本圖(資源管理部門提供);2、省級(jí)以上重點(diǎn)生態(tài)公益林區(qū)位圖(簡(jiǎn)稱規(guī)劃圖),上杭縣國(guó)家級(jí)重點(diǎn)生態(tài)公益林區(qū)位有:5億立方米以上大型水庫(kù)(棉花灘水庫(kù))周邊一重山和梅花山保護(hù)區(qū)。省級(jí)生態(tài)公益林生態(tài)區(qū)位有:汀江河干流、黃潭河干流、舊縣河干流一重山、交通干線一重山、飲用水水源保護(hù)區(qū)和森林公園的林地。
規(guī)劃圖只是基于衛(wèi)片影像圖和地形圖,根據(jù)自然地物地貌的特點(diǎn)及其空間位置來(lái)區(qū)劃勾繪的,與基本圖沒(méi)有必然關(guān)聯(lián),最終還要將規(guī)劃內(nèi)容落實(shí)到這些區(qū)域的林業(yè)基本圖小班中去。按一般性操作,首先用空間連接工具將林業(yè)基本圖與規(guī)劃圖進(jìn)行空間位置連接,生成過(guò)渡性的空間連接圖層,沿規(guī)劃界線檢查,若發(fā)現(xiàn)問(wèn)題,還得調(diào)整規(guī)劃圖,重復(fù)操作一面,而中間過(guò)渡性圖層并非我們所要的結(jié)果,卻要占用存儲(chǔ)空間資源。
類似的重復(fù)性工作在林業(yè)規(guī)劃中是經(jīng)常要做的工作,如濕地生態(tài)紅線規(guī)劃、保護(hù)區(qū)生態(tài)紅線規(guī)劃及每年度資源建檔變化小班圖斑的批量修正更新,共同點(diǎn)是需要規(guī)劃圖(或更新圖層)與基本圖之間比較分析、邏輯運(yùn)算、屬性表之間數(shù)值傳遞等操作。編寫程序代碼,完成相類似林業(yè)規(guī)劃工作,既不產(chǎn)生中間過(guò)渡圖層,又能完成重復(fù)性工作。
3.1 對(duì)象模型的層次結(jié)構(gòu)
一個(gè)對(duì)象代表一個(gè)空間要素,如村部位置、道路中心線或植被斑塊,圖1顯示了ArcMap中的地圖對(duì)象和圖層對(duì)象的層次結(jié)構(gòu),最頂層是Application(在這里是ArcMap),它由MxDocument對(duì)象構(gòu)成,MxDocument對(duì)象由Map對(duì)象構(gòu)成,Map是地圖對(duì)象,表示一張地圖或者一個(gè)數(shù)據(jù)框架,而Layer對(duì)象表示地圖中的要素型圖層。Map對(duì)象表現(xiàn)為數(shù)據(jù)框架。圖層,舉例來(lái)說(shuō),包括林業(yè)矢量圖(林業(yè)基本圖)、柵格圖(如衛(wèi)片和地形圖)。
ArcObjects的Geodatabase子系統(tǒng)包括數(shù)據(jù)集對(duì)象和數(shù)據(jù)源對(duì)象的層次結(jié)構(gòu)如圖2,數(shù)據(jù)集對(duì)象的一個(gè)對(duì)象對(duì)應(yīng)著表中的一行,而表中的列則記錄對(duì)象的屬性;數(shù)據(jù)源對(duì)象用于程序按指定路徑遍歷硬盤中數(shù)據(jù)集并添加到當(dāng)前地圖。頂層是WorkspaceFactory用于調(diào)用文件夾、個(gè)人Geodatabase和文件Geodatabase等,工作區(qū)對(duì)象(Workspace)是不同數(shù)據(jù)的一個(gè)容器,Dataset的類型有GeoDataset(地理數(shù)據(jù)集)和Table(表)兩種類型。Geo-Dataset包括要素圖層、要素類、柵格數(shù)據(jù)集和柵格圖層。Table對(duì)象是在表中存儲(chǔ)屬性的行的集合。例如,Table對(duì)象,包括文本格式的表、dBASE格式的表。
圖1 MrcMap中Application、MxDocument、Map以及Layer類的層次結(jié)構(gòu)
圖2 Geodatabase中WorkspaceFactory、Workspace以及Dataset類的層次結(jié)構(gòu)
ArcObjects對(duì)象模型很多,本文對(duì)案例的代碼中涉及的對(duì)象模型介紹,有助于理解案例中的代碼。
3.2 對(duì)象和類的接口
ArcObjects對(duì)象在VBA中不能直接引用,而是通過(guò)某個(gè)接口來(lái)訪問(wèn),有了接口才得以編程訪問(wèn)數(shù)據(jù)并執(zhí)行任務(wù)。例如經(jīng)常用變量PFeatureLayer指向某一圖層FeatureLayer對(duì)象是通過(guò)IFeatureLayer接口或IFeatureSelection接口來(lái)訪問(wèn)FeatureLayer對(duì)象,而不是直接訪問(wèn)對(duì)象本身,如圖3所示。PFeatureLayer的第一個(gè)字母P通常表示這是一個(gè)指針變量;IFeatureLayer和IFeatureSelection中第一個(gè)字母I通常表示這是個(gè)接口。字母的大小寫使其更易理解,這是對(duì)面向?qū)ο蠹夹g(shù)編程中的命名習(xí)慣。更確切地說(shuō),接口允許程序員使用該接口提供的屬性和方法。
圖3 FeatureLayer對(duì)象支持IFeatureLayer接口和IFeatureSelection
3.3 對(duì)象的屬性和方法
ArcObjects對(duì)象提供了豐富的內(nèi)建屬性和方法,調(diào)用其對(duì)象及對(duì)象現(xiàn)有的屬性和方法,可減少大量的編程工作。對(duì)象的屬性可能是數(shù)值,也可能是又一個(gè)對(duì)象,在對(duì)象模型中,很多對(duì)象是組件類,可以直接創(chuàng)建一個(gè)對(duì)象,當(dāng)開(kāi)發(fā)者使用Set、New關(guān)鍵字創(chuàng)建一個(gè)幾何對(duì)象后,其實(shí)是空的,它需要添加具體的屬性信息。FeatureLayer對(duì)象若是通過(guò)IFeatureSelection接口來(lái)訪問(wèn),帶來(lái)的便利是:可利用IFeatureSelection接口的SelectFeatures方法結(jié)合篩選器對(duì)象來(lái)選擇要素,并高亮顯示??臻g篩選器對(duì)象(SpatialFilter)能夠同時(shí)包括空間空間條件和屬性條件進(jìn)行數(shù)據(jù)查詢,該對(duì)象具有兩個(gè)重要的屬性:Geometry屬性和SpatialRel屬性。Geometry屬性定義用于篩選結(jié)果的幾何形狀。該幾何形狀可以是要素圖層上一個(gè)多邊形,也可以是由用戶繪制的幾何外框,如本案例中棉花灘水庫(kù)周邊一重山外圍規(guī)劃界線,或者交通干線的一個(gè)緩沖區(qū)。SpatialRel屬性定義用于選擇的空間關(guān)系。ArcOjects有10個(gè)預(yù)先定義的空間關(guān)系(圖4)。引用對(duì)象的方法會(huì)執(zhí)行特定的操作,可以理解為調(diào)用該對(duì)象私有過(guò)程(程序),引用對(duì)象的屬性和方法。
選擇正確的接口,獲取需要的屬性和方法是實(shí)現(xiàn)ArcObjects編程的核心內(nèi)容。
圖4 ArcObjects中預(yù)定義的空間關(guān)系可選常
4.1 開(kāi)發(fā)環(huán)境
在ArcGIS中安裝了VBA(Visual Basic for Applications)編程器后,可選擇自定義菜單下的VBA宏,再選擇Visual Basic編輯器,打開(kāi)Visual Basic編輯器,插入模塊,就可編寫程序了,在定義變量的數(shù)據(jù)類型時(shí),輸入關(guān)鍵字As、New和一個(gè)空格后VB編輯器則自動(dòng)用下拉式列表框顯示可用數(shù)據(jù)類型或?qū)ο蠼涌冢鐖D5a所示;在對(duì)象變量后輸入一個(gè)點(diǎn),VB編輯器則自動(dòng)用下拉列表顯示對(duì)象的可用的屬性和方法,輸入前幾個(gè)字母逐步縮小選擇范圍(圖5b);在VBA編輯器中打開(kāi)對(duì)象瀏覽器,可以很方便地查看對(duì)象及其屬性、方法、常量、變量,還可以用它來(lái)查看本工程內(nèi)使用既有的對(duì)象,如圖5c所示,左窗口為對(duì)象列表,右窗口顯示了選中對(duì)象所擁有的屬性和方法。享受友好的開(kāi)發(fā)環(huán)境,自動(dòng)完成的代碼都能識(shí)別順利運(yùn)行,調(diào)試保存后,自動(dòng)保存在normal.mxl(模板文檔)上。
圖5 a定義變量輸入As和空格后,下拉式列表框中逐步篩選顯示數(shù)據(jù)類型、對(duì)象接口
圖5 b對(duì)象變量后輸入點(diǎn),出現(xiàn)下拉式列表框,顯示該對(duì)象可用的屬性和方法
圖5 c打開(kāi)對(duì)象瀏覽器,查找對(duì)象、屬性、方法
4.2 代碼編寫
4.3 代碼要點(diǎn)
代碼運(yùn)行錯(cuò)誤時(shí),運(yùn)用對(duì)象Err提示錯(cuò)誤類型并結(jié)束。假設(shè),規(guī)劃圖.shp和林業(yè)基本圖.shp及地形圖已添加到當(dāng)前地圖,需要查詢基本圖中被規(guī)劃圖所包含的所有小班。變量pQueryFeatLayer和pFeatLayer分別指向林業(yè)基本圖和規(guī)劃圖,便于調(diào)用。
通過(guò)GeometryBag類來(lái)實(shí)現(xiàn)IGeometryCollection接口對(duì)象,接著,代碼利用IFeatureClass接口上的Search方法,創(chuàng)建了由pOutFeatureCursor所引用的要素游標(biāo)。通過(guò)GeometryCollection類實(shí)現(xiàn)IGeometryCollection接口對(duì)象,代碼用一個(gè)Do……Loop循環(huán),用IFeatureCursor對(duì)象接口的NextFeature方法來(lái)逐個(gè)訪問(wèn)pOutFeatureCursor(規(guī)劃圖所有要素,本案例只是模擬,只有一個(gè)要素),利用IGeometryCollection接口對(duì)象的方法AddGeometry方法把圖形信息添加進(jìn)去,長(zhǎng)整型變量Count用于規(guī)劃圖層要素計(jì)數(shù)。
創(chuàng)建ISpatialFilter接口對(duì)象來(lái)設(shè)置空間查詢邏輯運(yùn)算,本例空間關(guān)系設(shè)為esriSpatialRelContains方式,即選擇要素完全包含在幾何形狀內(nèi),可選空間關(guān)系有10種,選用不同參數(shù)完成不同空間查詢方式。
通過(guò)FeatureSelection獲得IFeatureSelection接口實(shí)例,最后調(diào)用IFeatureSelection接口對(duì)象的SelectFeatures方法將結(jié)果高亮顯示。
代碼用With……End With來(lái)減少訪問(wèn)對(duì)象的次數(shù),加快運(yùn)行速度。一致的縮進(jìn)格式使嵌套級(jí)別更具層次感,增加了代碼的可讀性。
4.4 代碼運(yùn)行及后期加工處理
將規(guī)劃圖層和林業(yè)基本圖(命名為“林業(yè)基本圖.shp”,與代碼中圖層名稱一致;也可將代碼中文件名“林業(yè)基本圖”按實(shí)際名稱替換)兩個(gè)圖層添加到數(shù)據(jù)圖層中,并確保兩個(gè)圖層排在圖層內(nèi)容列表的最頂部,將代碼復(fù)制到模塊里。按F5運(yùn)行代碼后,效果如圖6a,因圖幅所限,紅線只是模擬上杭縣棉花灘水庫(kù)國(guó)家級(jí)重點(diǎn)生態(tài)公益林區(qū)位規(guī)劃圖層的局部位置,規(guī)劃圖層(圖中紅色)所包含林業(yè)基本圖小班全部被選中。如圖6b,林業(yè)基本圖小班屬性表顯示了125個(gè)小班同時(shí)被選中。按規(guī)劃方案要求水庫(kù)周邊一重山都要規(guī)劃進(jìn)去,沿規(guī)劃圖邊沿檢查是否存在多選或漏選小班,若存在,還要對(duì)規(guī)劃圖作細(xì)微調(diào)整,重新運(yùn)行代碼,重新查詢規(guī)劃圖所包含小班,如此反復(fù)檢查直到正確為止,然后對(duì)選中的小班導(dǎo)出數(shù)據(jù),添加規(guī)劃名稱字段,用字段計(jì)算器做上規(guī)劃標(biāo)記(如區(qū)位名稱或區(qū)位代碼),批量處理,既不會(huì)出錯(cuò),效率又高。用刪除字段工具整理屬性表字段,使之與全省統(tǒng)一要求矢量圖數(shù)據(jù)結(jié)構(gòu)相一致后提交成果。
圖6 a兩個(gè)圖層之間空間選擇
圖6 b屬性表顯示125小班選擇中
若對(duì)代碼做小小的改動(dòng),修改圖層邏輯運(yùn)算就可以擴(kuò)展其它功能,圖層間運(yùn)算如改為對(duì)重疊空間進(jìn)行修正更新就可實(shí)現(xiàn)資源建檔中小班區(qū)劃圖斑批量修正更新,對(duì)小班邊界有重新區(qū)劃過(guò)的小班制作更新圖層,制作更新圖層時(shí),保留原小班邊界要用追蹤工具生成,確保無(wú)縫隙,修正更新后不致生成碎斑。
基于VBA的ArcObjects對(duì)象模型編寫程序,必須有VBA的編程基礎(chǔ),必須熟悉掌握ArcMap軟件一般操作和ArcObjects對(duì)象模型,ArcMaP提供了豐富的對(duì)象模型,掌握對(duì)象模型不容易,本文只能對(duì)與規(guī)劃功能有關(guān)的對(duì)象模型作簡(jiǎn)要介紹。本案例代碼解決了在規(guī)劃圖層初步做好后,能高效地反復(fù)檢查和調(diào)整規(guī)劃圖層,批量地對(duì)小班做上規(guī)劃標(biāo)記。
[1]Kang-tsung Chang.基于VBA的ArcObjects編程——面向任務(wù)的方法[M].北京:科學(xué)出版社,2010.
[2]傅仲良.ArcObjects二次開(kāi)發(fā)教程[M].北京:測(cè)繪出版社,2008.
[3]蘭小機(jī),劉德兒,魏瑞娟編著.基于ArcObjects與C#.NET的GIS應(yīng)用開(kāi)發(fā)[M],北京:冶金工業(yè)出版社,2011.
責(zé)任編輯/羅美娟
Understanding the ArcObjects Model and Editing the Forestry Plan Function Program
Qiu Guowen
(Shanghang County Forestry Bureau,Shanghang Fujian 364200,China)
S747.5
:A
1003-4382(2017)02-0040-05
2016-5-10
2016-07-12
丘國(guó)文(1968-),男,福建上杭人,林業(yè)工程師,主要從事林業(yè)調(diào)查規(guī)劃設(shè)計(jì)、營(yíng)林綠化及林業(yè)技術(shù)推廣工作。