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