余為益, 胡 紅, 陳春香
(1.上饒師范學(xué)院,江西 上饒 334001;2. 桂林工學(xué)院,廣西 桂林 541004)
GIS矢量圖層處理功能的MapObjects實現(xiàn)
余為益1,2, 胡 紅1, 陳春香2
(1.上饒師范學(xué)院,江西 上饒 334001;2. 桂林工學(xué)院,廣西 桂林 541004)
為避開專業(yè)GIS軟件操作的復(fù)雜性,以一個基于MapObjects的校園地物資源管理系統(tǒng)的圖層處理模塊為例,探討了應(yīng)用型GIS中矢量圖層創(chuàng)建、圖層坐標(biāo)系定義、圖元繪制、圖元編輯、圖元刪除等功能的具體實現(xiàn)方法。通過編程,用戶可以輕松完成對矢量圖層的各種加工處理,大大提高了用戶對圖形數(shù)據(jù)的處理效率。實驗結(jié)果說明,MapObjects組件特別適合處理地理信息,具有強大優(yōu)勢。
MapObjects;地理信息系統(tǒng);矢量圖層;坐標(biāo)系
在使用GIS系統(tǒng)進行工作的過程中,人們經(jīng)常需要做創(chuàng)建圖層、刪除圖層、給圖層定義坐標(biāo)系,添加、修改或刪除圖元這樣一些操作。關(guān)于這些操作和功能,很多專業(yè)GIS軟件都有提供。但由于大多數(shù)專業(yè)GIS軟件本身功能種類繁多,操作復(fù)雜,且無法自由、方便、又有選擇地將用戶真正所需的功能嵌入到適于某一方面專用的應(yīng)用型GIS系統(tǒng)中,因此在基于GIS的校園地物資源管理系統(tǒng)中,特別研制了一個用于矢量圖層處理的功能模塊,以避開專業(yè)GIS軟件操作的復(fù)雜性,提高用戶對GIS圖形數(shù)據(jù)的處理效率。本文簡要介紹了校園地物資源管理系統(tǒng)的開發(fā)技術(shù)和功能,并通過編程實現(xiàn)了矢量圖層處理模塊包含的各個功能。
MapObjects(簡稱MO)是一個性價比較高,功能較強的 OCX控件。它由一個稱為 Map Control的 ActiveX控件和一系列可編程的ActiveX對象組成。在VC++、VB、Delphi等可視化開發(fā)環(huán)境中,只需在設(shè)計階段將MapObjects控件插入工程,并對其進行編程、設(shè)置屬性或調(diào)用方法或相應(yīng)事件,即可實現(xiàn)豐富的地圖信息系統(tǒng)功能,而且應(yīng)用程序還能脫離專業(yè)GIS軟件平臺獨立運行。以下是 MapObjects的主要功能和特點。
MO是按層的方式來組織和操縱地圖數(shù)據(jù)的,即它將一副地圖分解成多個可以互相疊加的透明圖層,讓每個圖層代表整個地圖的一個方面。所有圖層加在一起構(gòu)成圖層集合(Layers)。在MO組件開發(fā)中,可以通過圖層集合元素獲得對任意圖層的編輯、調(diào)用或管理。MO圖層數(shù)據(jù)來源廣泛,既可以是 GIS矢量圖層,也可以是CAD圖層,甚至影像數(shù)據(jù)。對于GIS矢量圖層,如Shape圖層,其內(nèi)部統(tǒng)一用記錄集(Recordset)來表達層中各地理對象(或稱為圖元,通常分點、線、面、文字等的對象)的圖形及屬性數(shù)據(jù),如同關(guān)系數(shù)據(jù)庫中的二維表一樣,行表示地理對象,列表示屬性。其中,“Shape”列以面向?qū)ο蟮募夹g(shù)封裝了地理對象的圖形信息;“FID”列記錄了該對象在圖層中的排列序號,是每個地理對象的唯一標(biāo)識。其他屬性列則存儲了該圖元其他的一些必要屬性信息,稱圖元的內(nèi)部屬性信息。通過MO,可以像MIS對普通數(shù)據(jù)庫表一樣去管理、查詢、分析、創(chuàng)建、編輯和刪除這些記錄集中的所有數(shù)據(jù)。
MO開發(fā)中,可通過數(shù)據(jù)表對象(MapObjects2.Table),運用MapLayer對象的AddRelate方法將圖層和其他外部屬性數(shù)據(jù)(庫或表)連接,以使地理對象的空間數(shù)據(jù)(包括圖形及內(nèi)部屬性數(shù)據(jù))和外部的屬性數(shù)據(jù)進行拼接整合,并產(chǎn)生一一對應(yīng)關(guān)系。為此,MO常用的數(shù)據(jù)庫連接接口有:微軟的ActiveX Data Objects(OLE DB)、Microsoft Jet database engine databases(MDB)、Data Access Objects(DAO)。另外,MO還可以和ArcSDE數(shù)據(jù)庫、ODBC數(shù)據(jù)庫、ISAM數(shù)據(jù)庫和INFO數(shù)據(jù)庫等建立連接[1]。
圖文信息互查是一般GIS系統(tǒng)都應(yīng)該具備的功能。MO對此提供了一定的支持手段??山柚鶰O中MapLayer對象的以下三種方法先查得符合指定要求的記錄集,再從紀(jì)錄集中提取并顯示用戶想要的圖形或?qū)傩孕畔ⅰ_@三種方法分別是:①SearchByDistance(shape,tolerance,expression),按相應(yīng)位置的范圍搜索并返回符合空間查詢條件的要素記錄集;② SearchExpression(expression),按 SQL語句的條件從句搜索并返回符合要求的要素記錄集;③ SearchShape(shape,searchMethod,expression),搜索并返回在空間關(guān)系上符合參數(shù)searchMethod所指條件,邏輯條件符合表達式expression要求的要素記錄集[2]。
運用MO組件,用戶可以對地理矢量圖層及其上的圖元、頂點,乃至樣式、標(biāo)注等進行隨意的創(chuàng)建、編輯、刪除,還可以為圖層加上合適的坐標(biāo)數(shù)據(jù)等。在所有圖元當(dāng)中,點圖元是一種在地圖坐標(biāo)中具有X,Y坐標(biāo)值的幾何圖形,你可以通過屬性X,Y,Z讀取或設(shè)置一個點的位置;而多邊形或線圖元都有一個或多個屬性集合Parts,每個Parts由一個或多個Points對象構(gòu)成,每一個Points對象又由多個點對象構(gòu)成,它們代表線或多邊形的一個個頂點,正因如此,GIS開發(fā)人員可從創(chuàng)建或修改點、點集、部件著手對線或多邊形圖元進行創(chuàng)建和編輯等的工作。
MO提供了多種自帶工具,如利用圖例控件MoLegend可以實現(xiàn)地圖(圖層)在地圖控件Map中的加載、選定、移出、顯示順序調(diào)整、顏色或圖例設(shè)置等的功能;還可進行各種各樣的專題地圖制作工作;添加靈活美觀的標(biāo)注(注解);通過投影和坐標(biāo)變換按不同需要顯示地圖圖層。
系統(tǒng)以 Shape文件存儲校園地物的空間數(shù)據(jù),以SQL Server存儲地物的外部屬性數(shù)據(jù),利用 MO對地物對象的空間及屬性數(shù)據(jù)的調(diào)用與處理技術(shù),在Visual C++平臺上實現(xiàn)圖文信息皆可視的校園地物資源管理系統(tǒng)。
系統(tǒng)功能模塊劃分如下:
(1) 圖層控制模塊 實現(xiàn)地物圖層在地圖窗口中加載、顯示、隱藏、移出、顯示顏色設(shè)置等的功能,這是系統(tǒng)對地物資源信息實現(xiàn)圖形化查詢與分析的起點。為了盡量減少開發(fā)的工作量,系統(tǒng)引用MO自帶的圖例控件MoLegend簡化了上述功能的實現(xiàn)。
(2) 圖層處理模塊 該功能模塊主要用于幫助用戶實現(xiàn)對地理圖層、圖元的各種加工與處理,是本文研究的重點。主要涉及的功能項有:圖層的新建、圖層坐標(biāo)系定義、圖元編輯、圖元添加、圖元刪除等。
(3) 信息查詢模塊 提供由圖元查詢屬性和自定義 SQL查詢條件查詢符合要求的圖元這樣兩種方式的信息查詢。前一種主要通過在地圖窗口顯示的圖層上點擊、拉框選取一個或幾個圖元,再通過程序自動搜索圖元內(nèi)、外部屬性數(shù)據(jù)信息;后者則通過在某對話框中填寫、定制SQL查詢條件來定位、顯示滿足條件的圖元外觀和位置。
(4) 空間量測與分析模塊 實現(xiàn)對圖層上任意兩點或兩對象間空間距離的量測,和對某個地物的長度或面積進行量測的功能;分析功能包括對地物作緩沖區(qū)分析、制作包含重要數(shù)據(jù)的專題圖等功能。
系統(tǒng)主界面布局如圖1所示。
圖1 系統(tǒng)主界面布局
Shape文件是 ESRI提供的存儲地理數(shù)據(jù)的矢量形式。一個Shape文件對應(yīng)于一個MapLayer圖層,所以它又常被稱作Shape圖層文件。它由多個不同的文件共同組成,即后綴為.shp、.dbf、.shx、.prj、.sbn、.sbx 等的文件。后綴為.shp、.dbf、.shx的文件是構(gòu)成Shape圖層文件的基本文件;后綴為.prj的文件保存著Shape圖層的坐標(biāo)系信息,它反映了圖層數(shù)據(jù)是否經(jīng)過投影和如何被投影的詳細(xì)信息,故常將其稱為坐標(biāo)系文件或投影元數(shù)據(jù)文件。圖層坐標(biāo)系通常分為兩類:地理坐標(biāo)系和投影坐標(biāo)系。對于圖層上各點的位置,地理坐標(biāo)系使用經(jīng)緯度來刻劃,而投影坐標(biāo)系則使用平面直角坐標(biāo)(X, Y )來描述[3]。如果一個圖層的 prj文件只包含地理坐標(biāo)系信息,那么可以說該圖層是未經(jīng)投影的;否則,如果該圖層的 prj文件包含有投影坐標(biāo)系的信息(每一個完整投影坐標(biāo)系信息都必定含有一個地理坐標(biāo)系的信息),那么說該圖層是經(jīng)過投影的。
以下分別介紹圖層處理模塊中各功能項的實現(xiàn)方法和過程。
方法:先創(chuàng)建并設(shè)置好新圖層的 TableDesc對象,而后使用 AddGeoDataset方法產(chǎn)生一個GeoDataset對象,并加到一個DataConnection中,這樣就可在DataConnection的SetDatabase方法指定的地圖文件夾中產(chǎn)生了一個新的 Shape圖層。主要實現(xiàn)代碼示例如下:
應(yīng)用上述方法只能得到基本的圖層文件,并不能得到圖層的坐標(biāo)系文件。為圖層間實現(xiàn)有效的數(shù)據(jù)交換、配準(zhǔn)、共享,以及對其進行基于地理位置的處理和分析,就必須給新建的圖層配以合適的坐標(biāo)系信息。為此,MO不僅提供了一系列預(yù)定義坐標(biāo)系,還提供了其他一些對象來支持地圖或圖層的坐標(biāo)系定義,如投影坐標(biāo)系(CMoProjCoordSys)、地理坐標(biāo)系(CMo GeoCoo rd Sys)、投影(CMoProjection)、基準(zhǔn)面(CMoDatum)、測量單位(CMoUnit)、橢球體(CMoSpheroid)、本初子午線(CMo Prime Meridian)和地理坐標(biāo)轉(zhuǎn)換(CMoGeoTransformation)等對象[4],并為這些對象的不同模型、不同方法、不同參數(shù)定義了一些常數(shù)。GIS二次開發(fā)人員可利用這些對象以及對象的屬性、方法和常數(shù),方便地在標(biāo)準(zhǔn)的Windows編程環(huán)境中實現(xiàn)圖層任意坐標(biāo)系的定義與變換[5],為圖層生成特定的坐標(biāo)系文件,使圖層具有合適的坐標(biāo)系。以下是為Shape圖層生成合適坐標(biāo)系文件的兩種方法。
·直接輸出法
坐標(biāo)系對象. Export (LPCTSTR OutName)。其中:OutName表示輸出的坐標(biāo)系文件名(含路徑及后綴,主文件名必須和圖層的主文件名相同);坐標(biāo)系對象既可以是投影坐標(biāo)系對象又可以是地理坐標(biāo)系對象。構(gòu)建坐標(biāo)系對象的方法很多,以下以構(gòu)建地理坐標(biāo)系統(tǒng)對象theGC為例,對它們分別加以介紹。
(1) 引用現(xiàn)有圖層坐標(biāo)系信息構(gòu)建。主要示例代碼及過程如下:
//獲取現(xiàn)有圖層m_MapLayer的坐標(biāo)系
CMoGeoCoordSys theGC; /*構(gòu)建投影坐標(biāo)系對象實例:CMoProjCoordSys thePrj; */
theGC.AttachDispatch(val);
(2) 用投影元數(shù)據(jù)文件構(gòu)建。主要示例代碼及過程如下:
(3) 利用預(yù)定義常數(shù)構(gòu)建。
MO2為每個預(yù)定義坐標(biāo)系編了一個號碼(見MO常數(shù)表),讓每個編號對應(yīng)于一種預(yù)定義坐標(biāo)系,因此可用這個編號構(gòu)建預(yù)定義坐標(biāo)系對象實例。示例代碼如下:
CMoGeoCoordSys theGC; //創(chuàng)建一個接口對象Dispatch并與接口驅(qū)動連接
theGC.CreateDispatch(TEXT("MapObjects2.GeoCoordSys "));
theGC.SetType(4203); //直接用地理坐標(biāo)系編號構(gòu)建地理坐標(biāo)系對象實例
//theGC.SetType(moGeoCS_AGD1984);//用枚舉常量構(gòu)建地理坐標(biāo)系對象實例
為編程方便,MO2將各個預(yù)定義坐標(biāo)系的說明文字及其編號組合成一個個字符串,并在MapObjects2.Strings中設(shè)計了專門的方法揀取這些字符串。如有需要,還可從揀取出的字符串中提取相應(yīng)編號。示例代碼如下:/
/揀取全部預(yù)定義地理坐標(biāo)系字符串到geoStr
CheckOutNumb(geoStr,0); //從指定集合元素(第0個字符串)揀出坐標(biāo)系的編號(4201)
還可以利用 Strings對象的其它方法得到和坐標(biāo)系定義與轉(zhuǎn)換相關(guān)的更多參數(shù)(地球橢球體模型、基準(zhǔn)面、投影方法、地理坐標(biāo)系、投影坐標(biāo)系、地理轉(zhuǎn)換、本初子午線、測量單位、投影坐標(biāo)系統(tǒng)參數(shù)等),可對這些參數(shù)賦值或修改其值,構(gòu)建出符合實際要求的投影或地理坐標(biāo)系對象實例。有關(guān)示例代碼,限于篇幅,不再詳述。
· 變換輸出法
如果圖層現(xiàn)有的坐標(biāo)系并不符合實際需要,那么可以通過對原坐標(biāo)系進行變換并輸出的方法為圖層生成新的坐標(biāo)系文件。該方法的使用格式是:Object.Export(outName,outCoordSys)。其中:Object為圖層的記錄集對象;outName表示圖層文件名的字符串(含路徑,但不帶后綴)。原坐標(biāo)系由原圖層的坐標(biāo)系文件提供,不許額外的參數(shù),且原坐標(biāo)系和變換后的坐標(biāo)系類型都可以是CMoProjCoordSys或CMoGeoCoordSys。因此,該方法可以完成四種類型的坐標(biāo)系變換,見圖2所示。
圖2 坐標(biāo)系變換類型
圖3是本系統(tǒng)進行圖層坐標(biāo)系定義的流程圖。
圖3 系統(tǒng)圖層坐標(biāo)系定義流程圖
圖元操作包括對圖元或其頂點的繪制(增加)、位置移動、刪除等。在這些操作中,除繪制操作外,其他都必須先在操作圖層上選定一個圖元或其中的一個頂點,以作為操作的對象。為此,可以在地圖窗口控件 Map1的 MouseDown消息處理函數(shù)中添加如下主要代碼,使用戶可在操作圖層用鼠標(biāo)點選圖元:
//單擊當(dāng)前圖層選定目標(biāo)記錄集
//根據(jù)操作圖層的類型獲取選定的圖形及其Id屬性值
選定圖元對象后即可對對象(或其頂點)作移位、刪除、保存等的操作。用于實現(xiàn)圖元移位的方法及步驟如下:
(1) 移位
(2) 保存
不管是什么類型的圖元,它們移位后的保存方法都是一樣的,即:
關(guān)于線、面圖元的移位距離,本系統(tǒng)的做法是:將選定對象后在地圖窗口鼠標(biāo)單擊點(pt0)的位置作為點圖元移位的目標(biāo)位置。因此xLength,yWidth分別是pt0的X、Y坐標(biāo)值與原來選定對象時鼠標(biāo)單擊點X、Y坐標(biāo)值的差值。這樣設(shè)置的好處在于,能讓用戶將圖元對象形象、準(zhǔn)確地移位到用戶鼠標(biāo)單擊的位置上,獲得良好的交互性。
線、面圖元頂點編輯的實現(xiàn)較為復(fù)雜,基本思路是:先將圖層上所有特征圖形放到一個數(shù)組中,在用鼠標(biāo)點選頂點對象時,如果鼠標(biāo)點(將其轉(zhuǎn)換為地圖單位的點)與某頂點對象的距離小于某個閥值,則認(rèn)為是選定了該頂點對象,而后即可對該對象進行刪除、移位等操作;保存時,先將特征數(shù)組中的圖元添加到原圖層,而后再將圖層原有的圖元數(shù)據(jù)予以刪除,這樣就得到了頂點編輯后的新圖層,也即完成了一次頂點編輯操作。其中,主要用到的方法是:① pt.DistanceTo(LPDISPATCH shape),計算點pt到對象 shape的距離;② pts.Set(long index,LPDISPATCH Point),將線或面對象中某點集pts的點(序號為index)移位到目標(biāo)點Point位置上;③ rst.AddNew(),向圖層特征記錄集添加新記錄。圖4是對圖元頂點編輯的狀態(tài)圖。
圖4 圖元頂點編輯狀態(tài)圖
用于圖元刪除的代碼是:SelectedRec.Delete(); //刪除已選定的圖形記錄
繪制圖元的實現(xiàn)方法是:在 Map的MouseDown消息處理函數(shù)中,運用Map控件的ToMapPoint,TrackLine,TrackPolygon 、TrackCircle、 TrackRectangle等方法畫出圖元,并將該圖元添加作為圖層紀(jì)錄集中的新成員。主要示例代碼如下:
為了向用戶即時展示圖層上任意操作的過程和結(jié)果,可以在地圖對象Map的消息響應(yīng)函數(shù)AfterTrackingLayerDraw中調(diào)用 Map的DrawShape函數(shù)用不同于圖層的顏色對選定或操作的各種對象進行重繪,突出顯示。
地理圖層加工處理的效率是應(yīng)用型 GIS系統(tǒng)的重要因素。本文通過MO編程,實現(xiàn)了校園地物資源管理系統(tǒng)中矢量圖層創(chuàng)建、圖層坐標(biāo)系定義、圖元創(chuàng)建、圖元編輯、圖元移位、圖元刪除以及圖元頂點的增加、移位、刪除等的功能。利用系統(tǒng)的這些功能,用戶可以輕松完成對矢量圖層的各種處理,大大提高了用戶對矢量圖形數(shù)據(jù)的處理效率,同時使MO組件處理地理信息的強大優(yōu)勢得到了很好的體現(xiàn)。今后還要進一步加強和優(yōu)化系統(tǒng)后臺數(shù)據(jù)庫的建設(shè),對地物資源的外部屬性數(shù)據(jù)進行補充和完善,以便在系統(tǒng)中更好地實現(xiàn)以圖形化方式瀏覽和管理地物的所有屬性數(shù)據(jù)或基于這些數(shù)據(jù)創(chuàng)建各種各樣的專題渲染地圖。
[1]薛 偉. MapObjects——地理信息系統(tǒng)程序設(shè)計[M].北京:國防工業(yè)出版社, 2004. 207-209.
[2]徐蘇維, 盛業(yè)華, 黃家柱, 等. 基于 MapObjects的GIS綜合應(yīng)用開發(fā)[J]. 計算機工程與應(yīng)用, 2006, (1):194-197.
[3]周衛(wèi)娟, 張成剛. GIS軟件坐標(biāo)系統(tǒng)剖析[J]. 現(xiàn)代測繪, 2007, 30(2):13-16.
[4]韓 鵬. 地理信息系統(tǒng)開發(fā)—— MapObjects方法[M].武漢:武漢大學(xué)出版社, 2004. 77-80.
[5]張宏群. 基于組件式GIS的資源環(huán)境信息系統(tǒng)研究[D].貴陽:貴州師范大學(xué), 2004.
Realization of the Function of GIS Layer’s Processing with MapObjects
YU Wei-yi1,2, HU Hong1, CHEN Chun-xiang2
( 1. Shangrao Normal College, Shangrao Jiangxi 334001, China; 2. Guilin University of Technology, Guilin Guangxi 541004, China )
To avoid the complexity of special GIS software, this paper, taking the GIS layer processing module in a campus ground object resources’ administration system based on MapObjects for instance, discusses the method of how to realize the function of GIS layer’s processing. The effective programme can help users to complete the processing of vectorgraph layers easily, improve the efficiency greatly. The experiment results showed that the MapObjects’s functions are very suitable for processing geographic information, and is of strong advantage.
MapObjects; geographic information system; vectorgraph layer; coordinate system
TP 311;P 208
A
1003-0158(2010)06-0012-07
2009-03-07
上饒師院科研基金資助項目(2008015)
余為益(1976-),男,江西上饒人,講師,碩士,主要研究方向為GIS二次開發(fā)與數(shù)據(jù)庫應(yīng)用技術(shù)。