魏志明,李 家
(遼寧師范大學 城市與環境學院,遼寧 大連 116029)
?
ArcGIS Engine開發中復雜符號的實現
魏志明,李 家
(遼寧師范大學 城市與環境學院,遼寧 大連 116029)
摘要:提出了地圖符號概念:以ArcGIS Engine作為二次開發平臺,利用ArcGIS Engine組件庫所提供的接口,采用C#開發語言,實現在ArcGIS Engine中對條件符號、多層符號(如鐵路符號等)、唯一值符號的制定。分析了實現過程中所涉及的接口及接口中的相關屬性與方法。程序運行結果表明:基于ArcGIS Engine二次開發平臺,可以實現復雜符號的定制。
關鍵詞:地圖符號;ArcGIS Engine開發;條件符號;多層符號;唯一值符號
1前言
地圖符號是地圖的圖解語言,是表示地圖內容的基本手段[1]。空間中的地物依據其幾何外觀,可以抽象劃分為點狀、線狀、面狀3種類型。因此按空間分布情況,可相應地將地圖符號分為點狀符號、線狀符號和面狀符號[2]。既專業又形象的地圖符號可以更加生動的表達地圖的內容與含義[3,4]。雖然人工可以對圖層符號進行設置,但在動態生成圖層的情況下,需要根據具體需求通過開發語言編程實現符號的定制,可以大大地提高工作效率。例如大量的環境監測數據平時存儲在Oracle數據庫中,根據實際需要,要對監測數據進行動態生產如ArcGIS圖層格式的文件,此時則要根據圖例規范自動定制圖層符號,而不能通過人工去逐層更改。故無論是在地圖制圖系統中,還是在地圖信息系統中,地圖符號的制作與研究都是具有重要意義[5]。
2地圖符號概括
地圖符號從廣義上講是表示各種事物現象的線劃圖形、色彩、數學語言和記注的總和,也稱為地圖符號系統。而狹義的地圖符號是在圖上表示制圖對象空間分布、數量、質量等特征的標志和信息載體,包括線劃符號、色彩圖形和注記。
客觀世界的事物錯綜復雜,人們根據需要對它們進行歸納(分類、分級)和抽象,用比較簡單的符號形象地表現它們,不僅解決了描繪真實世界的困難,而且能反映出事物的本質和規律。因此,地圖符號的形成實質上是一種科學抽象的過程,是對制圖對象的首次綜合[7]。
3ArcGIS中符號概述
3.1符號分類
空間上的任何地物以其幾何外觀來劃分,可以抽象劃分為點狀、線狀、面狀3種類型[2]。在ArcGIS中包含點狀符號、線狀符號、面狀符號以及注記符號。其中注記作為一種特殊的符號,說明這些點、線、面的某些屬性,可以類似于點狀符號來處理[8]。
ArcMap中的將點狀符號分為6種。分別為3D標記符號、3D簡單標記符號、3D字符標記符號、地圖標記符號、簡單標記符號、箭頭標記符號和圖片標記符號。
3.2標注與注記
3.2.1標注
地圖上用來識別地圖要素的文本稱為標注(Label),其可以幫助地圖讀者更好地理解地圖含義。標注在ArcMap中表示圖層的屬性,可動態創建,可用于說明地圖上要素的名稱、性質和數量等具體特征。它彌補地圖符號的不足,豐富地圖的內容,并且在某種程度上還可以起到符號的作用,使地圖具有可讀性、可譯性以及成為一種信息傳輸工具。
3.2.2注記
在地圖上起說明作用的各種文字、數字,統稱注記。注記常和符號相配合,說明地圖上所表示的地物的名稱、位置、范圍、高低、等級、主次等。注記以更加復雜的方法和屬性來對要素的圖層進行標記,同時作為地理要素被儲存。每個注記都可以被獨立操作,可以選擇是否和其他要素相關,注記也可以由其他數據轉換而來。注記可分為名稱注記、說明注記、數字注記。為了鮮明、正確、便于讀解的目的,注記的字體、規格和用途必須有統一規定。
3.3TrueType字體
TrueType是由Apple公司和Microsoft公司聯合提出的一種新型數學字形描述技術。它用數學函數描述字體輪廓外形,含有字形構造、顏色填充、數字描述函數、流程條件控制、柵格處理控制、附加提示控制等指令。TrueType采用幾何學中二次B樣條曲線及直線來描述字體的外形輪廓,其特點是其既可以作打印字體,又可以用作屏幕顯示;由于它是由指令對字形進行描述,因此它與分辨率無關,輸出時總是按照打印機的分辨率輸出。無論放大或縮小,字符總是光滑的,不會有鋸齒出現。ArcGIS字體符號都是TrueType字體(.TTF),其最大的特點就是它是由一種數學模式來進行定義的基于輪廓技術的字體,這使得它們比基于矢量的字體更容易處理,保證了屏幕與打印輸出的一致性。
4復雜符號的實現
所謂復雜符號是相對于簡單符號而言的。復雜符號是由多個TrueType字體符號通過疊加、位移、組合等設置而形成的,而簡單符號僅由單一TrueType字體符號形成。如圖1所示,對水深點的深度屬性進行了標注。標注點圖1A將水深點的深度屬性通過程序代碼而表達成更加符合現實海圖中水深點符號的形式,并將標注作為要素符號顯示在地圖上,而標注點圖1B僅通過ArcMap軟件動態創建水深點的深度標注,與現實生活中海圖水深點的習慣表達方式不相符;由此也可以看出,復雜符號在表達地圖含義等方面,相對于簡單符號更具有優勢,故而復雜符號的設計對地圖完整含義的表達具有重要的價值。

圖1 水深標注分布
4.1條件符號
4.1.1概念
條件符號就是根據圖層中某一屬性要求確定的符號。將圖層的某幾個屬性通過腳本語言進行判斷,返回一個字符串作為符號顯示在地圖位置上用以解釋該要素屬性的具體意義。同一圖層中各要素因其屬性值的不同表現為不同的符號。
4.1.2實現代碼
條件符號的實現代碼如下。
(1) 獲取當前圖層。利用IGeoFeatureLayer接口去定義一個圖層變量,指向axMapControl控件的一個圖層。
(2)獲取標注集。在函數中定義IAnnotateLayerPropertiesCollection(注釋層屬性集合)接口變量 coll,將coll變量指向當前獲取圖層的注記屬性,即用AnnotationProperties來獲取當前圖層的標注集(標注集與某個要素圖層相關聯,用于描述要素圖層是如何被標記的)。若coll不為空,則用Clear方法將coll置空,再重新設置要素標注集。若coll為空,則將coll定義為AnnotateLayerPropertiesCollectionClass集合對象并指向當前圖層的標注集。
(3)設置標注布局。定義IPointPlacementPriorties接口place變量來完成對標注位置布局的設置。用變量place 控制要素標注的位置。利用接口中的AboveCenter、AboveLeft、AboveRight、BelowCenter、BelowRight、CenterLeft、CenterRight7個屬性設置標注的具體位置。
(4)設置標注位置與樣式。IBasicOverposterLayerProperties接口定義的basic變量可以用于對標注文本的位置以及標注文本的樣式進行具體設定,將basic指向BasicOverposterLayerPropertiesClass。esriBasicOverposterFeatureType是一個提供標簽功能的枚舉類型,其中包括esriOverposterPoint、esriOverposterPolyline、esriOverposterPolygon三個常量。設置basic的要素類型為esriBasicOverposterFeatureType的esriOverposterpoint常量值;將basic變量的標簽放置位置的優先選擇屬性指向控制標簽布局的place變量。
(5)要素屬性字段的獲取與設置。獲取符號某個字段的屬性值與樣式的設置需要添加JavaScirpt語句。IAnnotationExpressionEngine接口提供的方法可以訪問基于標簽屬性生成的JavaScirpt腳本信息。故而應首先定義一個AnnotationJScriptEngineClass類型的變量jsEngine,并且指向AnnotationJScriptEngine對象。再新建一個圖層標注引擎對象label,用來對圖層標注屬性進行相關的設置。ILabelEngineLayerProperties接口提供了相關屬性的設置,定義ILabelEngineLayerProperties接口變量label指向LabelEngineLayerPropertiesClass()對象,將label是否是簡單表達式屬性設置為否,利用label的Expression屬性,運用JavaScript語言來設置標注表達式。在代碼中加入的JavaScirpt腳本代碼是根據要素的具體屬性進行的符號設置,創建名為FindLabel的函數,獲取要素deep的屬性值,若屬性值中含小數點,則定義一個變量n保存小數點的位置,返回屬性值中小數點前面的字符串;如果不包含小數點則返回傳來的屬性值。并將Label的ExpressionParser屬性指向腳本解析器的對象jsEngine。BasicOverposterLayerProperties屬性用于指向確定標注位置的變量basic。
(6)字體設置。利用命名空間stodle的IFontDisp接口定義變量font,用于設置字體信息。變量font的name屬性設置字體為宋體。label的Symbol.Size屬性用于設置字體大小、Font屬性設置字體類型為宋體。通過ISimpleTextSymbol接口的YOffset屬性設置文字符號的y軸偏移量。通過coll變量的Add屬性增加這個文字符號到標注集中。
(7)屬性字段小數點后字符的設置。按照上述的順序重新定義一個LabelEngineLayerPropertiesClass類的變量label,根據要素屬性重新設置label變量的IsExpressionSimple、Expression、ExpressionParser、BasicOverposterLayerProperties屬性,重新指向字體類型、文字大小、橫縱軸偏移位置。在Expression屬性中的JavaScript腳本代碼中獲取deep字段小數點后面的數值。最后通過coll變量的Add屬性增加另一個文字符號到標注集中。
(8)顯示標注。將IGeoFeatureLayer接口的DisplayAnnotation屬性值設置為true,顯示該圖層的標注。
(9)渲染圖層。定義ISimpleRenderer接口變量simpleRender指向geoFeatureLayer圖層的Renderer屬性,用于對該圖層進行渲染。利用循環語句分別訪問符號的每一層,并對顏色進行設置。IColor接口提供訪問顏色的成員。定義一個IColor接口的變量pColor,將變量mSymbol每層的Color屬性指向變量pColor,使該符號的顏色為無色IColor接口的NullColor屬性賦予true,設置每層顏色為無色。否則定義ISimpleMarkerSymbol接口變量markerSymbol指向simpleRender變量的Symbol屬性,用來確定該渲染器中的Symbol屬性。ISimpleMarkerSymbol接口的Outline屬性賦予false,使該符號無輪框線。代碼如下:
ISimpleRenderer simpleRenderer = geoLayer.Renderer as ISimpleRenderer;
if (simpleRenderer.Symbol is IMultiLayerMarkerSymbol)
{
IMultiLayerMarkerSymbol mSimbol = simpleRenderer.Symbol as IMultiLayerMarkerSymbol;
IColor pColor1 = new RgbColor();
for (int i = 0; i < mSimbol.LayerCount; i++)
{
mSimbol.get_Layer(i).Color = pColor1;
pColor1.NullColor = true;
mSimbol.get_Layer(i).Color = pColor1;
}
}
else
{
ISimpleMarkerSymbol markerSymbol = simpleRenderer.Symbol as ISimpleMarkerSymbol;
IColor pColor = new RgbColor();
pColor.NullColor = true;
markerSymbol.Color = pColor;
markerSymbol.Outline = false;
}
(10) 刷新圖層。利用AxMapControl控件的Refresh方法對圖層進行刷新。
4.2多層符號
4.2.1多層符號
多層符號即具有簡單性又具有復雜性。多層符號的簡單性體現在于對疊加的層數沒有限制,可根據地理要素屬性的具體要求自由組合;復雜性則是在進行編碼之前需要了解各種符號類型,以便更準確的選擇符號。
4.2.2多層點狀實現代碼
多層點狀符號的實現可以分為如下步驟。
(1) 獲取當前圖層。獲取當前圖層最簡便的方法是直接利用IGeoFeatureLayer接口定義一個圖層變量。
(2) 獲取顏色值。IRgbColor接口提供訪問控制RGB顏色值的成員。定義IRgbColor接口變量rgbColor獲取自定義函數getRGB的返回值。
(3) 符號樣式設置。FontDisp接口用來定義新的字型。利用命名空間stdole的IFontDisp接口定義變量font,將變量font的Name屬性指向ESRI系統自帶符號樣式ESRI Business。Bold屬性用來表示符號的邊框是否加粗,返回bool值。
(4) 符號屬性設置。ICharacterMarkerSymbol接口提供訪問控制字符的標記符號的成員,該接口的Font、Size、Color以及CharacterIndex屬性分別用來描述標記符號的字體類型、大小、顏色以及在某一字體中的字符索引。定義一個ICharacterMarkerSymbol接口的變量symbol,將該變量的Font屬性指向int型變量font,Size屬性賦值為50,Color屬性指向IRgbColor接口的rgbColor變量,CharacterIndex屬性賦值為33,相當于在該字體中指定第33個符號。
(5) 添加符號層。IMultiLayerMarkerSymbol接口提供存取控制多層標記符號的成員,該接口的AddLayer方法用來添加標記符號。定義IMultiLayerMarkerSymbol接口變量multiLayermrkSymbol,調用該接口的AddLayer方法,傳入symbol參數,在符號層中添加第一層符號。
創建第二層符號時,就是重復上述的編碼過程,重新定義IRgbColor接口變量rgbColor1。利用IFontDisp接口新建變量font1,將該變量的Name屬性指向字體類型為華文彩云,Bold屬性為true。定義ICharacterMarkerSymbol接口變量symbol_1,將該變量的Font屬性指向int型變量font,Size屬性賦值為60,Color屬性指向IRgbColor接口的rgbColor變量,CharacterIndex屬性賦值為42。最后利用IMultiLayerMarkerSymbol接口的AddLayer方法傳入symbol_1參數,在符號層中添加第二層符號。
(6) 渲染多層符號。定義ISimpleRenderer接口變量render,將變量render的Symbol屬性指向IMultiLayerMarkerSymbol接口變量multiLayermrkSymbol,來繪制雙層符號。將geoFeatureLayer圖層的Renderer渲染器屬性指向render變量。
(7) 刷新圖層。利用AxMapControl控件的Represh方法對圖層進行刷新。
4.2.3多層線狀符號的實現
多層線狀符號以鐵路符號為例,分別設置黑白兩個線狀符號,通過在新圖成上將線狀符號疊合而成。
(1)設置底層簡單線狀符號。利用 ILineSymbol接口定義一個新的線狀要素集并利用接口中的Color獲取顏色,利用 ILineSymbol接口中的Width定義底層黑色線狀符號的寬度。
(2)設置上層線狀符號。利用ICartographicLineSymbol接口定義一個新的線狀要素集并利用接口中的Color獲取顏色,利用 ILineSymbol接口中的Width定義上層白色線狀符號的寬度。
(3)設置上層白色線狀符號間隔。定義ITemplate接口變量,并利用ITemplate接口中的Interval設置白色線狀符號的間隔為10。使用ITemplate接口中AddPatternElement繪制線狀符號與留白的比率為1:1。設置偏移量為0。
(4)疊合圖層。IMultiLayerMarkerSymbol接口提供存取控制多層標記符號的成員,該接口的AddLayer方法用來添加標記符號。定義IMultiLayerMarkerSymbol接口變量multiLayermrkSymbol,調用該接口的AddLayer方法,傳入symbol參數,在符號層中添加底層符號。重復上述方法在添加上層符號。
(5) 渲染圖層。定義ISimpleRenderer接口變量rende。將geoFeatureLayer圖層的Renderer渲染器屬性指向render變量,渲染圖層。
4.3唯一值符號
唯一值符號是根據要素的一個或幾個不同屬性字段的值,給每個要素一個單獨的顏色符號,從而區分每一個要素。這其中的顏色選擇是根據具體的需要,在進行編碼之前進行相應的篩選,對于屬性字段的選擇同樣是在實現編碼之前進行篩選。唯一值符號可以清晰地表示出每一個要素的區別,但它也具有局限性,唯一值符號的實現對屬性字段的值有相應要求,即各個要素的屬性值必須不同的,否則符號一致。
實現唯一值符號可以分為如下6個步驟。
4.3.1 構建顏色帶
唯一值符號的實現不僅需要構建獲取顏色函數,也要構建創建顏色帶的函數:private IColorRamp CreateAlgorithmicColorRamp(int count),其中函數中的參數count為顏色梯度個數。函數中的代碼可以分為如下幾個主要部分。
(1)創建顏色梯度成員。IAlgorithmicColorRamp接口提供訪問控制顏色梯度算法的成員,故定義IAlgorithmicColorRamp接口變量algColorRamp。IRgbColor接口提供訪問控制RGB顏色值的成員,定義IRgbColor接口fromColor變量為開始顏色,toColor變量為結束顏色。
(2)設置起始與結束顏色。通過變量fromColor和toColor的Red、Green和Blue屬性設置開始顏色和結束顏色。
(3)顏色梯度設置。IAlgorithmicColorRamp接口的FromColor屬性用來獲取顏色梯度中的第一個顏色,ToColor屬性用來獲取顏色梯帶的最后一個顏色。IAlgorithmicColorRamp接口的Algorithm屬性用來設置顏色梯度類型,esriColorRampAlgorithm枚舉用來指定顏色梯度,其中一種枚舉常量是esriCIELabAlgorithm,它的屬性值為1。將algColorRamp變量的FormColor屬性指向toColor 變量,ToColor屬性指向fromColor變量,Algorithm屬性指向esriColorRampAlgorithm . esriCIELabAlgorithm恒量,Size屬性賦值為count。
(4)要素屬性字段的獲取與設置。定義一個bool值變量bture,賦值true。IAlgorithmicColorRamp接口的CreateRamp方法根據確定的梯度長度屬性值生成顏色梯度。給algColorRamp變量的CreateRamp方法一個bool值參數,最后返回一個顏色梯度。
4.3.2獲取當前圖層
用IGeoFeatureLayer接口定義一個圖層變量。
4.3.3設置渲染對象
IUniqueValueRenderer接口提供訪問唯一值屬性符號的渲染器的對象,定義IUniqueValueRenderer接口的變量uniqueValueRenderer,將該接口表示確定唯一值的字段個數的屬性(FieldCount)設置為1,用于設置具體的屬性字段名稱方法(set_Field方法)的第二個參數設置為name。
4.3.4符號填充
SimpleFillSymbol是簡單填充符號的接口,esriSimpleFillStyle類是用來描述符號樣式。定義 SimpleFillSymbol接口變量 SimpleFillSymbol,將該變量的 Style 屬性賦為esriSimpleFillStyle枚舉的esriSFSSolid常量。
4.3.5獲取游標遍歷要素
IFeatureCursor接口可以遍歷選定的要素。定義IFeatureCursor接口變量featureCursor指向geoFeatureLayer,調用IFeatureClass接口的Search方法,獲取游標。如果游標featureCursor不為空,則定義IEnumColors接口變量enumColors接收CreateAlgorithmicColorRamp函數返回的Color屬性值,同時給CreateAlgorithmicColorRamp函數傳入40作為顏色的梯度的個數。定義一個int型變量fieldIndex通過geoFeatureLayer變量調用FeatureClass類的Fields屬性的FindField方法,獲取屬性字段name的索引。IFeatureCursor接口的NextFeature方法用來返回游標中的下一個要素。通過while循環,獲取每個要素的name字段的值,同時利用IEnumColors接口的Next方法獲取顏色梯度值,賦給一個SimpleFillSymbol對象。通過IUniqueValueRenderer接口的AddValue方法傳入字段值、字段名稱和需要填充的符號,就可增加一個唯一值符號層。
4.3.6實現渲染并刷新圖層
將geoFeatureLayer圖層變量的Renderer屬性設置為uniqueValueRenderer變量改變該圖層的渲染效果,利用AxMapControl控件中的Refresh方法對圖層進行刷新。
5結語
對ArcGIS中的符號以及標注與注記等相關內容做了大致的說明,并著重對以ArcGIS Engine作為開發平臺,采用C#開發語言實現條件符號、多層符號和唯一值符號的制定做了具體分析。通過對復雜符號的實現,探究摸索了ArcGIS Engine中與復雜符號定制相關的接口的用途以及使用方法。從而得出這樣的結論:基于ArcGIS Engine二次開發平臺,不僅可以實現復雜符號的制作,而且還可以根據需要,把要實現的各種功能組件搭建起來,從而實現地理信息系統的靈活應用和功能擴展。
參考文獻:
[1]胡慶武.基于MapObject的地圖符號庫設計[J].測繪學報,2001(10).
[2]姜琦,周曉光.基于ARCGIS土地利用現狀圖符號化的探討[J].地理信息世界,2012(2).
[3]劉洪光. 基于ArcGIS的地質災害地圖符號庫設計與實現[J]. 國土資源遙感,2011(1).
[4]劉志軍.基于ArcGIS的空間數據符號化研究[J].海洋測繪,2010(1).
[5]趙成福.基于ArcGIS+Engine的符號化研究與實現[J].地理空間信息,2009(4).
[6]何忠煥.GIS符號庫中復雜線狀符號設計技術的研究[J].武漢大學學報,2004(2).
[7]陶陶,閭國年.GIS地圖符號共享研究進展與展望[J].中國氣象圖像學報,2008(8).
[8]楊杰,廖勝利.基于AE二次開發的地圖符號的實現[J].四川測繪,2007(2).
[9]邱洪剛,張青蓮,陸紹強.ArcGIS Engine開發從入門到精通[M].北京:人民郵電出版社,2010.
[10]趙江洪,殷贛華.通用地圖符號庫的算法設計及其實現[J].測繪通報,2002(4).
[11]張俊嶺,夏武,熊衛東.基于ArcGIS+Engine的地圖符號制作工具的設計實現[J].測繪信息與工程.2006(5).
[12]譚浩強.C語言程序設計[M].3版.北京:清華大學出版社,2009.
[13]李崇貴,陳崢.ArcGIS Engine組件式開發及應用[M].北京:科學出版社,2012.
The Realization of Complex Symbols in Development ofArcGIS Engine
Wei Zhiming,Li Jia
(CollegeofUrbanandEnvironmentalSciences,LiaoningNormalUniversity,Liaoning116029)
Abstract:At the beginning, the overview of map symbol was briefly presented. Based on the second development platform of ArcGIS Engine, the customization of conditional-symbol, specific symbol such as railway sign of ArcGIS Engine and unique value render function are developed in C# by using module class, interface, methods and types from ArcObjects component library. What’s more, it emphatically describes all of the interfaces and their attributes and methods that are involved in the implement procedure. The results showed complex symbols can be designed with the second development platform of ArcGIS Engine, having a certain reference value to customize complicated signs and develop GIS.
Key words:map symbol;ArcGIS Engine;conditions symbol; multilayer symbol; unique value symbol
收稿日期:2016-04-14
作者簡介:魏志明(1991—),男,遼寧師范大學城市與環境學院碩士研究生。
中圖分類號:P208
文獻標識碼:A
文章編號:1674-9944(2016)10-0225-05