劉 金,李 鋼,陳國良
(1.中國礦業大學 環境與測繪學院,江蘇 徐州221116;2.徐州市國土資源局,江蘇 徐州221116)
一般來說,地圖符號的設計和實現方法分為兩種:一是在已有軟件的基礎上利用其二次開發語言及自身的圖形編輯功能進行自定義符號,如ArcInfo,AutoCAD,MapInfo,ArcView以及Corel-Draw等[1-3];二是利用程序語言自己開發符號設計軟件平臺實現符號,目前,最流行的就是OOP和COM技術等[4-10]。地圖符號庫主要是針對計算機而不是專門針對地理信息可視化,而我國的各種比例尺地圖中的地理信息內容十分豐富,要素表述非常詳盡,現無法擴展復雜和特殊的符號。
為了克服組件MapObjects自帶缺省符號的缺乏無法滿足工程的需要,主要研究一種在地理信息工程中可以根據地圖符號規范來制作地圖面符號庫,具有良好的擴充作用,滿足相應工程需要,應用于實際工程,同時對制作點線符號庫也有很大的參考價值。
面狀符號是指地圖上用來表示呈面狀分布的物體或地理現象的符號,它在二維圖的各方向上都能按比例表示,如按比例表示的耕地、果園、水域等符號。
面狀符號除了擁有地圖符號的一般特點外,面狀符號還有如下特點:
1)面狀符號一般有一個封閉輪廓邊界線,這個邊界線可以是有形的也可以是無形的。
2)面狀符號的面積和范圍都是依比例表示的,其大小隨地圖比例尺變化而變化。
3)為區別邊界線范圍內的對象,不同的面狀符號在邊界線范圍內填充不同的點符號、線符號、位圖或顏色來區分。
面狀符號實際上是一種組合符號,一般都是由填充組合而成。一般面狀符號的填充方式有三種:點狀符號填充、暈線填充、簡單填充。
三種填充方式各有特點,通過查閱大量文獻比較和比較各種符號制作軟件,設計出一種比較好的制作方式。在CorelDRAW中設置版面,按照地形圖圖式規范進行繪制,可以準確設置符號大小和位移間隔。需要注意的是頁面設置大小能符合循環,圖1示出了用CorelDRAW繪制菜地的實例。為了在應用工程調用比較好的效果,再輸出bmp格式根據需要調整大小。

圖1 菜地制作與規范
位圖繪制比較方便,繪制位圖地圖符號基本可以滿足點狀地物及復雜點狀地物。在GIS中,利用位圖表示面狀地物有以下幾個優點[11]:
1)對客觀世界中的目標地物抽象時丟失的許多直觀信息可以通過該地物的實際圖片或象形圖片展示,能直接了解地物信息。
2)對空間信息的可視化有重要的幫助,由于位圖的設計可以很方便地融合藝術的手段,這些在矢量圖形編程中有時并不容易做到。通過位圖提供的豐富的符號,可以通過這種方式應用到系統中,增強信息的表達能力和視覺美觀。
3)利用位圖符號可以直接作為專題圖的圖例用,可以直接創建諸如點要素分布的專題地圖。
MapObjects是由美國環境系統研究所(ESRI)開發的一組供應用開發人員使用的制圖與GIS功能組件。它由一個ActiveX控件和一系列可編程OLE(對象鏈接與嵌入)對象組成[12]。
MapObjects的CMoSymbol對象為用戶提供了有限的缺省的符號樣(SymbolStyle)。MO默認缺省面狀符號11種,符號類型和值分別通過Style,SymbolType屬性設置。這種方式符號數目少,樣式單一,不具有專業領域應用前景,不能滿足實際應用系統對符號表現多樣化的要求。
MapObjects雖然本身不帶有豐富的符號庫,但它能提供自定義符號的接口函數,使得符號的設計和擴展成為可能[13]。提供的接口自定義符號,可以建立一套自己需要的符號庫系統。使用ICustomMarker用來實現點狀符號的接口。對于MapObjects中實現自定義符號繪制的自動化對象,至少要實現3個基本函數[14],分別為
1)SetupDC:該函數用來建立繪制符號的設備上下文(Device Context)和設置一些繪制所需要的參數,如符號大小、旋轉角度等。
2)ReleaseDC:該函數清除當前設備上下文并恢復原始的設備上下文,用來為下一次繪制提供一個初始設備上下文。
3)Draw:這個函數是自定義符號中最重要的一個函數,它實現了自定義符號的繪制。
通過利用Windows GDI函數,能靈活地繪制各種符號,包括圖元、幾何圖形以及三維實體,通過這些符號能非常形象逼真地顯示客觀世界中的對象。
用CorelDRAW軟件制作好的相應比例尺地圖面符號,可以實現在工程中的調用,主要流程如圖2所示。

圖2 自定義面符號實現流程
ATL是ActiveX Template Library的縮寫,它是一套C++模板庫。MapObjects已經提供的自定義接口,利用ATL很容易生成DLL,所以使用ATL是一種簡單快捷的方法。
創建自定義面狀符號,選擇接口ICustomFill,以保證能夠執行面符接口。三個基本函數Setup-DC、ResetDC和Draw,注意面中的points是封閉的點串:

開發地理信息工程人員,可能對于Windows GDI繪制符號不精通,可以用位圖顯示來顯示復雜地圖符號,很好地解決符號編程的困難。為每一個符號創建一個自動化對象是不切實際的,需將面符號對象建成一個對象庫,并且具有很好的擴展性。
主要用到加載位圖和多邊形填充方法來實現面狀符號的調用和填充。關鍵實現代碼如下:

編譯生成dll。已經生成了一個自定義面狀狀符號,它放在一個名CustomFillSymbol.dll的動態庫文件中,并且可以在MapObjects環境中調用它。
對于將同類面符建成同一符號庫,可以通過ATL簡單實現,方法與前面相同,可以繼續添加如Fill2,Fill3等,使用DLL,可以方便在后臺維護,也方便對符號庫的管理。這樣就建立一個符號對應表如表1所示,供用戶需要來選擇。

表1 DLL中符號對應表
在VC++6.0環境中編寫一個小的應用工程來實現如何調用剛才生成的自定義面符號。
在應用工程中包含下面的語句,主要作用是調用DLL:

利用ICustomFillPtr來定義指針了,為了方便用戶的使用,利用對話框來實現交互。具體關鍵實現代碼:


在應用工程下實現面狀符號DLL的調用(以菜地為例),如圖3所示。

圖3 菜地符號調用效果
一般MapObjects默認是整個圖層,但是在實際工程中往往需要對不用圖層實現不同的屬性,所以CMoValueMapRenderer對象的唯一屬性值符號化地圖。假設當前有一個土地使用圖層,它是由不同使用方式的土地組成:一些住宅區,一些是公園,一些是工業區,還有一些是耕地等。現在要做的工作是,從記錄字段中提取屬性按土地使用圖層進行分類分級顯示,原理與上述一樣,就是用屬性字段的每一個值顯示一種符號,以Symbol(i)設置具體的符號特性。對MapObjects自帶的“STATES”面圖層中的“AREA”屬性進行分級,其中部分屬性用自定義的面符號來顯示。具體實現效果如圖4所示。

圖4 面符號符號化效果
主要給出了通過CorelDraw軟件繪制地圖面符號,制作出高精度又可以根據不同比例尺的地圖符號,同時很好利用MapObjects提供的面符號接口,實現對符號庫的制作和擴充。
地圖符號在GIS中占有非常重要的地位,地圖符號隨著GIS的發展而改進,目前在GIS中對地圖符號的研究還屬于初級階段,有許多地方還不夠完善,未來還有很多的工作需要去進一步的研究和解決:
1)尚未涉及到點線符號制作和調用,尚未解決線狀符號的快速實現,在用到純函數繪制時,由于知識受限,無法繪制復雜線狀符號,通過在CorelDRAW軟件繪制好符號,在系統中加載位圖或者與ARCGIS中的制作線符號實現,在后期學習中應進一步研究實現。
2)地圖符號庫包括地圖符號編輯器,利用制作軟件來繪制地圖符號,但不是專門制作GIS地圖符號的軟件,開發一個脫平臺的地圖符號編輯器也是后期研究的重點。最好能夠設計接口在不同平臺實現調用。
3)主要研究的是二維的地圖符號,而地圖符號已經開始向多方向發展:從靜態符號到動態符號發展;從二維符號向三維符號發展以及多媒體地圖符號的發展。
[1] 姚興海,馬秋云.基于CorelDraw的地圖符號庫建庫[J].測繪通報,2003(2):36-38.
[2] 羅慶洲,張衛民,李先華.在常用GIS軟件中實現自定義地圖符號[J].測繪通報,2003(1):44-45.
[3] 程朋根.GeoStar地圖符號的實現方法[J].地礦測繪,1999(3):3-6.
[4] 談曉軍,邊馥苓,何忠煥.地圖符號可視化系統的面向對象設計與實現[J].測繪通報,2003(1):11-13.
[5] 楊春成,宋志剛,吳文會.基于OOP技術的地圖符號制作工具的設計與實現[J].測繪科學,2002,27(1):50-53.
[6] 蔡忠亮,李 霖.普通地圖符號的全開放式設計[J].武漢測繪科技大學學報,1999,24(3):259-261.
[7] 吳立新,劉純波,陳桂茹,等.地圖符號庫的面向對象技術和引用接口[J].礦山測量,1999(1):32-35.
[8] 程朋根,龔健雅,眭海剛.GIS中地圖符號設計系統的設計與實現[J].中國圖形圖象學報,2002,5(A)(12):1006-1011.
[9] FRANK A U,ENGENHOFER M J.Computer cartography for GIS,an object-oriented view on display transformation[J].Computer and Geo-sciences,1992,18(8):975-987.
[10] 王 偉,張 波,殷贛華.基于COM技術的地圖符號庫結構設計與實現[J].武漢大學學報·信息科學版,2002,27(3):296-300.
[11] 劉黎明.基于MapObjects的位圖符號的設計與應用[OL][2006-07-31].中 國 科 技 論 文 在 線.http://www.paper.edu.cn.
[12] 胡慶武.基于MapObject的地圖符號庫設計[J].測繪通報,2001(10):15-17.
[13] 趙冬泉,賈海峰,程聲通.基于MapObjects的排水管道流向表達與編輯[J].測繪通報,2004(8):36-37,55.
[14] 戴 維,劉志輝.基于MapObjects的自定義地圖符號塊的實現[J].水土保持研究,2008(2),15(1):196-197.