樊文鋒,王 懷,葉芳宏
(國家測繪地理信息局衛(wèi)星測繪應(yīng)用中心,北京100830)
基于Style符號(hào)庫的存取研究及符號(hào)選擇器實(shí)現(xiàn)
樊文鋒,王 懷,葉芳宏
(國家測繪地理信息局衛(wèi)星測繪應(yīng)用中心,北京100830)
在ArcGIS Engine的應(yīng)用開發(fā)中,無法直接利用Style符號(hào)庫文件。通過對(duì)ArcGIS符號(hào)庫文件存儲(chǔ)結(jié)構(gòu)的剖析,詳細(xì)分析符號(hào)存取的接口方法,并在此基礎(chǔ)上開發(fā)出針對(duì)Style符號(hào)庫文件的符號(hào)選擇器組件,且該組件能夠在ArcGIS Engine的應(yīng)用開發(fā)系統(tǒng)中直接使用。
符號(hào);序列化;重構(gòu)
符號(hào)是一種物質(zhì)的對(duì)象、屬性或過程,可用它來表示抽象的概念。符號(hào)是地圖的語言單位,是可視化表達(dá)地理數(shù)據(jù)信息內(nèi)容的基礎(chǔ)工具。地圖符號(hào)是符號(hào)應(yīng)用于地圖的一個(gè)子類,具有語義、語法和語用規(guī)則[1]。地形信息符號(hào)庫是地圖符號(hào)的匯集系統(tǒng),它利用計(jì)算機(jī)進(jìn)行管理,以實(shí)現(xiàn)符號(hào)數(shù)據(jù)的存儲(chǔ)、檢索和更新[2]。隨著地理信息系統(tǒng)技術(shù)和理論的發(fā)展及其在各行業(yè)的廣泛應(yīng)用,地理信息符號(hào)化表現(xiàn)形式已經(jīng)發(fā)生了巨大的變化,其功能也由認(rèn)知地圖空間為主擴(kuò)展至動(dòng)態(tài)導(dǎo)航、輔助決策。
ArcGIS針對(duì)地理數(shù)據(jù)的點(diǎn)、線、面要素提供了不同類型的符號(hào),用戶可以選用任意一種類型符號(hào)對(duì)地理數(shù)據(jù)進(jìn)行符號(hào)化顯示。而且ArcGIS符號(hào)設(shè)計(jì)完全是在ArcGIS桌面環(huán)境ArcMap下實(shí)現(xiàn),以Style庫文件存儲(chǔ)。但是基于ArcGIS Engine的應(yīng)用開發(fā)中,采用的是ServerStyle符號(hào)文件,無法直接使用ArcGIS桌面環(huán)境下設(shè)計(jì)的Style符號(hào)文件,只有通過工具M(jìn)akeServerStyle把Style符號(hào)庫文件制作成ServerStyle符號(hào)庫文件才能供其使用。但在實(shí)際應(yīng)用中,很多ArcGIS Engine應(yīng)用開發(fā)都希望能夠在系統(tǒng)中直接使用Style符號(hào)庫文件,而不需要通過第三方工具轉(zhuǎn)換。
筆者通過研究剖析Style符號(hào)庫文件的存儲(chǔ)結(jié)構(gòu),編程開發(fā)了利用Style符號(hào)庫文件的選擇器組件,使得在ArcGIS Engine應(yīng)用開發(fā)中能夠直接使用Style符號(hào)庫文件。本文主要探討Style符號(hào)庫文件的存儲(chǔ)結(jié)構(gòu)、符號(hào)存儲(chǔ)接口以及符號(hào)選擇器的實(shí)現(xiàn)。
Style符號(hào)庫文件實(shí)際上是小型關(guān)系型數(shù)據(jù)庫文件,其文件的擴(kuò)展名為*.style,可以將擴(kuò)展名更改為*.mdb后用微軟的Access軟件打開。
數(shù)據(jù)庫中的每個(gè)表結(jié)構(gòu)都相同,每個(gè)表都是由ID、Name、Category、Object 4個(gè)字段組成。其中,ID字段是整型數(shù)據(jù)類型,是該表的關(guān)鍵字,保持記錄的唯一性;Name字段是字符串類型,用來命名符號(hào)的名稱,在對(duì)地理數(shù)據(jù)符號(hào)化的過程中,可以將地理數(shù)據(jù)的屬性信息與該字段進(jìn)行自動(dòng)符號(hào)化;Category字段是字符串類型,用來表示符號(hào)的分類,可以通過該字段進(jìn)行分類查詢過濾;Object字段是OLE類型,用來存儲(chǔ)符號(hào)的信息,該字段包含了符號(hào)的CLSID值和符號(hào)信息數(shù)據(jù),是通過符號(hào)序列化接口序列化后的二進(jìn)制數(shù)據(jù)流。在符號(hào)二進(jìn)制數(shù)據(jù)流中,前16字節(jié)是符號(hào)對(duì)象的CLSID值,是GUID數(shù)據(jù)類型,通過CLSID值可以創(chuàng)建符號(hào)對(duì)象;余下的數(shù)據(jù)流是符號(hào)信息數(shù)據(jù),包含了符號(hào)的顏色、大小、寬度、旋轉(zhuǎn)角度等信息,可通過序列化和反序列化實(shí)現(xiàn)存儲(chǔ)和讀取。
數(shù)據(jù)庫中的每一張表對(duì)應(yīng)著ArcGIS符號(hào)中的一類符號(hào),數(shù)據(jù)庫中存儲(chǔ)ArcGIS基本的點(diǎn)、線、面、文本符號(hào)以及其他顏色、比例尺、圖例等符號(hào)[3]。
從ArcGIS的應(yīng)用開發(fā)包中可以看出,實(shí)現(xiàn)符號(hào)的存儲(chǔ)、顯示以及符號(hào)的選擇主要由符號(hào)序列化結(jié)構(gòu)、基本的符號(hào)接口、符號(hào)庫的訪問接口以及符號(hào)庫文件等接口組成。以下將描述主要的接口及其實(shí)現(xiàn)方法。
1.序列化接口
序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可存儲(chǔ)的數(shù)據(jù)流格式的過程。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。將這兩個(gè)過程結(jié)合起來,可以輕松地存儲(chǔ)和重構(gòu)數(shù)據(jù)。序列化接口主要是實(shí)現(xiàn)符號(hào)的存儲(chǔ)和重構(gòu),包括 IPersist、IStream、IPersistStream、IBlobStream、IMemoryBlobStream等主要接口。其中,IPersist、IStream、IPersistStream是微軟提供的數(shù)據(jù)流標(biāo)準(zhǔn)接口。IPersist是獲取對(duì)象的CLSID值的接口; IStream是對(duì)數(shù)據(jù)流進(jìn)行讀取、寫入以及移位等操作的接口;IPersistStream是根據(jù)加載和保存數(shù)據(jù)流的接口。而IBlobStream、IMemoryBlobStream兩個(gè)接口主要實(shí)現(xiàn)符號(hào)對(duì)象的存取。其中,IMemoryBlobStream繼承IBlobStream、IStream接口,并在IMemory-BlobStream接口的實(shí)現(xiàn)類中全部實(shí)現(xiàn)其接口的方法以及屬性,還可實(shí)現(xiàn)將符號(hào)對(duì)象序列化成二進(jìn)制數(shù)據(jù)流存儲(chǔ)和從二進(jìn)制數(shù)據(jù)流中反序列化重構(gòu)符號(hào)對(duì)象。
2.基本符號(hào)接口
ArcGIS提供了 ISymbol、IMarkerSymbol、ILine-Symbol、IFillSymbol以及ITextSymbol等基本符號(hào)對(duì)象接口,根據(jù)這些接口可再衍生出其他豐富的符號(hào)接口,如IPictureMarkerSymbol等。其中,ISymbol是符號(hào)對(duì)象根據(jù)圖形設(shè)備接口進(jìn)行繪制,所有的符號(hào)必須繼承該接口;IMarkerSymbol、ILineSymbol、IFill-Symbol和ITextSymbol分別是點(diǎn)、線、面、文本符號(hào)的基本接口,且定義了符號(hào)的大小、寬度、顏色、旋轉(zhuǎn)角度、字體等信息。其派生的符號(hào)對(duì)象接口必須繼承基本符號(hào)接口,其實(shí)現(xiàn)類中必須實(shí)現(xiàn)其方法和屬性。同時(shí),IMarkerSymbol、ILineSymbol、IFillSymbol和ITextSymbol派生接口的實(shí)現(xiàn)類必須實(shí)現(xiàn)IPersist、IPersistStream接口的方法和屬性,以實(shí)現(xiàn)符號(hào)對(duì)象的存取。
3.符號(hào)庫訪問接口
符號(hào)庫的訪問接口主要由IStyleGallery、IStyle-GalleryStorage和數(shù)據(jù)庫訪問ADO接口組成,用于實(shí)現(xiàn)符號(hào)對(duì)象序列化成二進(jìn)制數(shù)據(jù)流存儲(chǔ)到符號(hào)庫中,以及從符號(hào)庫中取出二進(jìn)制數(shù)據(jù)流重構(gòu)符號(hào)對(duì)象。IStyleGallery接口是應(yīng)用系統(tǒng)從符號(hào)庫中提供符號(hào)對(duì)象和將符號(hào)對(duì)象保存到符號(hào)庫中的接口; IStyleGalleryStorage接口是管理多個(gè)符號(hào)庫文件的接口,并能使符號(hào)選擇器同時(shí)能夠打開多個(gè)符號(hào)庫文件;ADO接口是對(duì)數(shù)據(jù)庫表進(jìn)行插入、查詢、更新操作的接口。
以下將闡述如何對(duì)IMemoryBlobStream接口實(shí)現(xiàn)在內(nèi)存中進(jìn)行數(shù)據(jù)流操作,如何以點(diǎn)符號(hào)對(duì)象為例實(shí)現(xiàn)符號(hào)序列化存儲(chǔ)和反序列化重構(gòu),如何以C#語言編程實(shí)現(xiàn)符號(hào)選擇器組件。圖1是符號(hào)對(duì)象序列化重構(gòu)的流程圖。
圖1 符號(hào)序列化重構(gòu)流程圖
1.IMemoryBlobStream接口實(shí)現(xiàn)類
IMemoryBlobStream接口的實(shí)現(xiàn)類中,繼承實(shí)現(xiàn)了IStream的方法及屬性。其實(shí)現(xiàn)過程如下:
1)創(chuàng)建內(nèi)存存儲(chǔ)區(qū)域,根據(jù)數(shù)據(jù)的大小動(dòng)態(tài)調(diào)整內(nèi)存空間的大小。
2)實(shí)現(xiàn)IStream接口的Write、Read、Seek方法,即分別是寫入內(nèi)存、讀取內(nèi)存、內(nèi)存地址移動(dòng)。
3)實(shí)現(xiàn)ExportToVariant方法,從內(nèi)存數(shù)據(jù)空間導(dǎo)出符號(hào)對(duì)象序列化得數(shù)據(jù)流,實(shí)現(xiàn)符號(hào)對(duì)象序列化操作。
4)實(shí)現(xiàn)ImportFromMemory方法,加載外部內(nèi)存空間的符號(hào)對(duì)象的數(shù)據(jù)流,供符號(hào)對(duì)象使用,實(shí)現(xiàn)反序列化操作。
2.序列化存儲(chǔ)操作
以簡單點(diǎn)符號(hào)為例實(shí)現(xiàn)符號(hào)對(duì)象的序列化存儲(chǔ),如用簡單點(diǎn)符號(hào)的成員變量描述符號(hào)的大小、顏色、旋轉(zhuǎn)角度屬性。下面用部分代碼描述序列化過程。
1)簡單點(diǎn)符號(hào)的成員變量
int m_lColor;
double m_dAngle;
double m_dSize;
2)簡單點(diǎn)符號(hào)序列化存儲(chǔ)函數(shù)Save,其中參數(shù)pStream實(shí)現(xiàn)了IMemoryBlobStream接口的Write方法向內(nèi)存中寫入數(shù)據(jù)
Void Save(IStream*pStream)
3)簡單點(diǎn)符號(hào)反序列化重構(gòu)函數(shù)Load,其中,參數(shù) pStream實(shí)現(xiàn)了 IMemoryBlobStream接口的Read方法向內(nèi)存中讀取數(shù)據(jù)
3.IStyleGallery接口實(shí)現(xiàn)類
在IStyleGallery接口實(shí)現(xiàn)類中,主要的方法是實(shí)現(xiàn)對(duì)符號(hào)庫文件的加載、符號(hào)分類獲取以及符號(hào)存儲(chǔ),下面是實(shí)現(xiàn)該接口的主要方法和屬性。
1)LoadStyle方法,即加載符號(hào)庫文件,對(duì)多個(gè)符號(hào)庫文件進(jìn)行管理。
2)SaveStyle方法,即保存符號(hào)至符號(hào)庫文件。
3)AddItem方法,即存儲(chǔ)符號(hào)。
4)Categories屬性,即獲取符號(hào)的分類。
5)Items屬性,即獲取符號(hào)對(duì)象。
4.符號(hào)選擇器
符號(hào)選擇器為ArcGIS Engine的應(yīng)用開發(fā)提供了一個(gè)可視化的符號(hào)對(duì)象瀏覽工具,應(yīng)用開發(fā)系統(tǒng)可以通過它預(yù)覽符號(hào)庫中的符號(hào)。符號(hào)選擇器可以根據(jù)當(dāng)前要符號(hào)化的地理數(shù)據(jù)屬性(點(diǎn)、線、面)從符號(hào)庫文件中加載全部的符號(hào),也可以加載指定的類別的符號(hào)。在ArcGIS桌面環(huán)境ArcMap下的符號(hào)選擇器,能夠?qū)x定的符號(hào)作適當(dāng)?shù)木庉嬓薷暮髮?duì)地理數(shù)據(jù)進(jìn)行符號(hào)化,同時(shí)也能對(duì)修改后的符號(hào)進(jìn)行保存處理。在本文中實(shí)現(xiàn)的符號(hào)選擇組件暫時(shí)不能夠提供選定符號(hào)對(duì)象的編輯修改以及保存操作。
本文描述的符號(hào)選擇器組件采用C#語言開發(fā),實(shí)現(xiàn)了對(duì)Style符號(hào)庫文件的符號(hào)選取,并應(yīng)用在以ArcGIS Engine開發(fā)的某省級(jí)基礎(chǔ)地理信息數(shù)據(jù)庫管理系統(tǒng)中。圖2、圖3是已實(shí)現(xiàn)的該符號(hào)選擇器組件截圖。
圖2 多邊形符號(hào)選擇
圖3 線型符號(hào)選擇
本文通過對(duì)ArcGIS Style符號(hào)庫文件存儲(chǔ)結(jié)構(gòu)、符號(hào)庫文件讀取結(jié)構(gòu)和各級(jí)序列化接口的研究剖析,在Microsoft framework.NET環(huán)境下設(shè)計(jì)并開發(fā)了ArcGIS Style符號(hào)庫文件的符號(hào)選擇器組件。該組件是一個(gè)獨(dú)立的模塊,可以獨(dú)立運(yùn)行,也可嵌入到其他基于ArcGIS Engine開發(fā)的應(yīng)用系統(tǒng)中,能夠方便地滿足應(yīng)用系統(tǒng)直接調(diào)用Style符號(hào)庫文件的需求,具有較好的開放性和實(shí)用價(jià)值。
[1] 劉梅.地圖符號(hào)學(xué)在數(shù)字制圖條件下的應(yīng)用[J].現(xiàn)代測繪,2009,32(4):59-61.
[2] 王哲.ArcGIS軟件平臺(tái)上基于基礎(chǔ)地理信息數(shù)據(jù)庫的地圖符號(hào)化表達(dá)[J].現(xiàn)代測繪,2008,31(4):39-41.
[3] 張俊嶺,熊衛(wèi)東,夏斌.基于ArcEngine的地圖符號(hào)制作工具研建[J].測繪科學(xué),2007,32(5):86-87.
Research on Style Symbol Library Access and the Implementation of the Symbol Selector
FAN Wenfeng,WANG Huai,YE Fanghong
0494-0911(2011)11-0025-03
P208
B
2011-08-24
樊文鋒(1970—),男,河北棗強(qiáng)人,工程師,主要從事航空與航天攝影測量、遙感、地理信息系統(tǒng)應(yīng)用開發(fā)工作。