符號化Symbol(符號)體系
ArcGIS Engine9.3為開發人員提供了32種符號,主要分為三大類符號MarkerSymbol(點符號)、 LineSymbol(線符號)和FillSymbol(填充符號)來繪制地理要素的幾何圖形。此外還有兩種特殊類型的符號:一種是TextSymbol用於文字標注;另一種是3D Chart符號,用於顯示餅圖等三維對象,如需詳細了解請查找幫助文檔。
1. MarkerSymbol對象
MarkerSymbol用於修飾點對象的符號,它擁有十三個子類如表2所示,其中不同的子類可以產生不同類型的點符號。所有的MarkerSymbol類都實現了IMarkerSymbol接口,這個接口定義了標記符號的公共方法和屬性,如角度、顏色、大小和X,Y偏移量等
表二
點符號類型 |
描述 |
ArrowMarkerSymbol |
預定義的肩頭符號 |
BarChartSymbol |
柱狀圖符號 |
CharacterMarker3DSymbol |
三維字體符號 |
CharacterMarkerSymbol |
字體符號 |
Marker3DSymbol |
3D 符號 |
MultiLayerMarkerSymbol |
多個符號疊加產生新點符號 |
PictureMarkerSymbol |
圖片符號(bmp或emf) |
PiechartSymbol |
餅圖符號 |
SimpleMarker3DSymbol |
簡單3D符號 |
SimpleMarkerSymbol |
簡單符號 |
StackedChartSymbol |
堆疊符號 |
TextMarkerSymbol |
文字符號用來符號化點 |
常用的有以下5種 類型:
如何創建MarkerSymbol?接下來以SimpleMarkerSymbol構建為例演示如何創建一個點符號:
//創建SimpleMarkerSymbolClass對象
ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();
//創建RgbColorClass對象為pSimpleMarkerSymbol設置顏色
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pSimpleMarkerSymbol.Color = pRgbColor as IColor;
//設置pSimpleMarkerSymbol對象的符號類型,選擇鑽石
pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;
//設置pSimpleMarkerSymbol對象大小,設置為5
pSimpleMarkerSymbol.Size = 5;
//顯示外框線
pSimpleMarkerSymbol.Outline = true;
//為外框線設置顏色
IRgbColor pLineRgbColor = new RgbColorClass();
pLineRgbColor.Green = 255;
pSimpleMarkerSymbol.OutlineColor = pLineRgbColor as IColor;
//設置外框線的寬度
pSimpleMarkerSymbol.OutlineSize = 1;
如何使用這個符號,在接下來介紹Renderer對象的時候將為大家演示如何用創建的點符號去符號化一個圖層。
2. LineSymbol對象
LineSymbol對象是用於修飾線型幾何對象的符號,它擁有八個子類如表3所示,其中不同的子類可以產生不同類型的線符號,所有的LineSymbol類都實現了ILineSymbol接口, ILineSymbol定義了兩個公共屬性:Color和Width。
表三
線符號類型 |
描述 |
CartographicLineSymbol |
實心或者虛線線符號 |
HashLineSymbol |
離散線符號 |
MarkerLineSymbol |
點線符號 |
MultiLayerLineSymbol |
多符號疊加產生新線符號 |
PictureLineSymbol |
圖片線符號 |
SimpleLine3DSymbol |
3D 線符號 |
SimpleLineSymbol |
預定義風格的線符號 |
TextureLineSymbol (3DAnalyst) |
紋理貼 圖線符號 |
常用的LineSymbol如下圖所示:
符號化Symbol(符號)體系 ArcGIS Engine9.3為開發人員提供了32種符號,主要分為三大類符號MarkerSymbol(點符號)、 LineSymbol(線符號)和FillSymbol(填充符號)來繪制地理要素的幾何圖形。此外還有兩種特殊類型的符號:一種是TextSymbol用於文字標注;另一種是3D Chart符號,用於顯示餅圖等三維對象,如需詳細了解請查找幫助文檔。 1. MarkerSymbol對象 MarkerSymbol用於修飾點對象的符號,它擁有十三個子類如表2所示,其中不同的子類可以產生不同類型的點符號。所有的MarkerSymbol類都實現了IMarkerSymbol接口,這個接口定義了標記符號的公共方法和屬性,如角度、顏色、大小和X,Y偏移量等 表二
常用的有以下5種 類型:
如何創建MarkerSymbol?接下來以SimpleMarkerSymbol構建為例演示如何創建一個點符號:
ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass(); //創建RgbColorClass對象為pSimpleMarkerSymbol設置顏色 IRgbColor pRgbColor = new RgbColorClass(); //設置pSimpleMarkerSymbol對象的符號類型,選擇鑽石 //設置pSimpleMarkerSymbol對象大小,設置為5 //顯示外框線 //為外框線設置顏色 IRgbColor pLineRgbColor = new RgbColorClass(); //設置外框線的寬度 pSimpleMarkerSymbol.OutlineSize = 1;
LineSymbol對象是用於修飾線型幾何對象的符號,它擁有八個子類如表3所示,其中不同的子類可以產生不同類型的線符號,所有的LineSymbol類都實現了ILineSymbol接口, ILineSymbol定義了兩個公共屬性:Color和Width。 表三
常用的LineSymbol如下圖所示: 如何創建LineSymbol?接下來以MarkerLineSymbol構建為例演示如何創建一個線符號:
IRgbColor pRgbColor = new RgbColorClass(); IMarkerLineSymbol pMarkerLine = new MarkerLineSymbolClass(); IRgbColor pLineColor = new RgbColorClass(); 3. FillSymbol對象 FillSymbol是用來修飾如多邊形等具有面積的幾何形體的符號對象,它擁有十一個子類如表4所示它實現了IFillSymbol,這個接口定義了兩個屬性Color和OutLine,以滿足所有類型的FillSymbol對象的公共屬性設置。 表四
常用的FillSymbol如下圖所示: 如何創建FillSymbol?接下來以MarkerLineSymbol構建為例演示如何創建一個線符號: //為填充符號創建外框線符號 IColor pLineColor = new RgbColorClass(); ICartographicLineSymbol pCartoLineSymbol = new CartographicLineSymbolClass(); pCartoLineSymbol.Width = 2; pCartoLineSymbol.Color = pLineColor; //創建一個填充符號 ISimpleFillSymbol pSmplFillSymbol = new SimpleFillSymbol(); //設置填充符號的屬性 IColor pRgbClr = new RgbColorClass(); IFillSymbol pFillSymbol = pSmplFillSymbol; pFillSymbol.Color = pRgbClr;
如果沒有ArcGIS Desktop使用經驗的開發看了以上代碼片段會一頭霧水,不明白填充符號的創建為什么還要創建線符號等等,如果有ArcGIS Desktop使用經驗就會非常容易理解這些符號的創建的機制,如圖8是SimpleFillSymbol設置信息。所以熟悉ArcGIS Desktop的使用對開發人員進行ArcGIS Engine開發非常有用。
4. TextSymbol對象 TextSymbol對象是用於修飾文字元素的,文字元素在要素標注等方面很有用處。TextSymbol符號最重要的設置對象是它的字符,它實現了三個主要的接口來設置字符:ITextSymbol 、 ISimpleTextSymbol 和 IFormattedTextSymbol 。 ITextSymbol接口是定義文本字符樣式的主要接口,它定義的ITextSymbol::Font屬性是產生一個TextSymbol符號的關鍵。可以使用IFontDisp接口來設置字體的大小和是否是粗體、傾斜等屬性。使用ITextSymbol接口還可以定義TextSymbol對象的顏色、角度、水平排列方式、垂直排列方式和文本等內容。 以下是一個構建TextSymbol的函數: ///<summary> ///生成文本符號 ///</summary> ///<param name="pTxtSymbol">文本符號</param> ///<param name="sFontName">字體名稱</param> ///<param name="iFont">字體大小</param> ///<param name="iColor">字體顏色</param> public static void MakeTextSymbol(ref ITextSymbol pTxtSymbol, string sFontName, int iFont, int iColor) { try
pTxtSymbol.Color = (IColor)pRGBColor;
catch (Exception Err) MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
3DChartSymbol是一個抽象類,它擁有三個子類:BarChart、PieChart和StackedChart。如下圖所示:
BarChartSymbol是最常用的三維着色符號,它使用不同類型的柱子來代表一個要素類中不同的屬性,而柱子的高度取決於屬性值的大小。 PieChartSymbol符號進行着色的方法是使用一個餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數值大小占有一個餅圖中的不同比例的扇形區域。 PieChartSymbol符號進行着色的方法是使用一個餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數值大小占有一個餅圖中的不同比例的扇形區域。 至於如何創建這些3DChartSymbol符號這里不再提供代碼片段演示,讀者可以根據前邊學習的知識,自己操作ArcGIS Desktop使用3DChartSymbol制作專題圖,然后根據ArcGIS Engine的幫助文檔開發創建3DChartSymbol。 |
使用ServerStyle 如果熟悉ArcGIS Desktop的使用,就會對Style符號庫文件有所了解,相對應的在ArcGIS Engine開發中對應的是ServerStyle符號庫,它的結構體系如下圖所示。可以通過專門的轉換程序把ArcGIS Desktop Style符號庫轉換為ArcGIS Engine所能夠使用的ServerStyle符號庫。 表
4.5.1獲取符號庫中符號 如何獲取到一個符號庫中符號?接下來以獲取ESRI符號庫中名稱為Rose的符號的流程: 1.首先構建一個ServerStyleGallery對象 整個流程圖如下圖所示:
SymbologyControl控件 SymbologyControl用來顯示ServerStyle符號庫中的符號樣式,可以選擇在該控件上選擇一個符號用來符號化一個圖層或者作為一個Element的符號。使用SymbologyControl可以再設計的模式下在其屬性頁中加載ServerStyle符號庫文件,同樣也可以使用的LoadStyleFile和RemoveFile方法加載和移除Serverstyle符號庫文件。運行效果如下圖所示:
符號化之Renderer( 渲染)體系 ArcGIS Engine9.3對GIS數據的符號化分為矢量數據渲染和柵格數據渲染兩大類。接下來分別介紹FeatureRender和RasterRender。 1. FeatureRender對象 FeatureRenderer是一個抽象類,它有15個子類負責進行不同類型的着色運算。它們都實現了IFeatureRenderer接口,這個接口定義了進行要素圖層符號化的公共屬性和方法。 可以通過IGeoFeatureLayer::Renderer屬性獲得一個要素圖層的符號化對象 表四
2. RasterRender對象 RasterRender是一個抽象類,它有15個子類負責進行不同類型的着色運算。它們都實現了IRasterRender接口,這個接口定義了柵格圖層符號化的公共屬性和方法。可以通過IRasterLayer::Renderer屬性獲得一個柵格圖層的符號化對象。
柵格符號化類型結構圖如下圖所示:
以下代碼片段是對一個RasterLayer進行RasterStretchColorRampRenderer符號化操作:
/// StretchColorRamp符號化RasterLayer ///</summary> ///<param name="pRasterLayer">RasterLayer</param> public void SetStretchColorRampRenderer(IRasterLayer pRasterLayer) try //創建RasterStretchColorRampRendererClass對象 IRasterStretchColorRampRenderer pRStretchRender= new RasterStretchColorRampRendererClass(); //QI到IRasterRenderer IRasterRenderer pRasterRender=pRStretchRender as IRasterRenderer; pRasterRender.Update(); //創建兩個起始顏色 IRgbColor pFromRgbColor = new RgbColorClass(); IRgbColor pToRgbColor = new RgbColorClass(); //創建起止顏色帶 IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass(); bool btrue= true; //選擇拉伸顏色帶符號化的波段 //設置拉伸顏色帶符號化所采用的顏色帶 //符號化RasterLayer
catch(Exception Err) MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information); |
ArcGIS Engine開發 --圖層符號化(四)
利用ESRI自帶的符號庫進行唯一值符號化一圖層開發實例 實現唯一值符號化功能代碼如下: ///<summary> ///獲取符號庫中符號 ///</summary> ///<param name="sServerStylePath">符號庫全路徑名稱</param> ///<param name="sGalleryClassName">GalleryClass名稱</param> ///<param name="symbolName">符號名稱</param> ///<returns>符號</returns> private ISymbol GetSymbol(string sServerStylePath, string sGalleryClassName, string symbolName) try //ServerStyleGallery對象 IStyleGallery pStyleGaller = new ServerStyleGalleryClass(); IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage; IEnumStyleGalleryItem pEnumSyleGalleryItem=null; IStyleGalleryItem pStyleGallerItem = null; IStyleGalleryClass pStyleGalleryClass = null; //使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle文件 pStyleGalleryStorage.AddFile(sServerStylePath); //遍歷ServerGallery中的Class for (int i = 0; i < pStyleGaller.ClassCount; i++) if (pStyleGalleryClass.Name != sGalleryClassName) continue; //獲取EnumStyleGalleryItem對象 //遍歷pEnumSyleGalleryItem while (pStyleGallerItem != null) { //獲取符號 ISymbol pSymbol = pStyleGallerItem.Item as ISymbol; } System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem); return null; catch (Exception Err) { MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; ///<summary> ///設置要素圖層唯一值符號化 ///</summary> ///<param name="pFeatureLayer"></param> private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer) { try //創建UniqueValueRendererClass對象 IUniqueValueRenderer pUVRender = new UniqueValueRendererClass(); List<string> pFieldValues= new List<string>(); for(int i=0;i<pFieldValues.Count;i++) ISymbol pSymbol= new SimpleMarkerSymbolClass(); //添加唯一值符號化字段值和相對應的符號 //設置唯一值符號化的字段個數和字段名 pUVRender.set_Field(0, "類別"); IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer; //設置IGeofeatureLayer的Renderer屬性 catch (Exception Err) MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer; UniqueValueRenderFlyr(pFeatureLayer); this.axMapControl1.Refresh(); 設計GIS系統符號化模塊 大家首先有個觀念:用ArcEngine開發C/S應用程序時,一個成熟的GIS項目在加載數據這方面是不允許直接把SDE里邊的數據以MXD的形式組織起來這是不科學的,原因如下: 1.從數據安全性考慮 一個MXD文檔包含了SDE數據庫里與MXD數據的詳細信息,通常對於數據擁有者來說是不希望外部能夠獲取這些信息的。 2.從系統靈活性考慮 接下來我將從兩種途徑給大家介紹一下如果動態符號化圖層: 使用ArcEngine開發C/S應用程序數據加載一個重要的功能模塊,在數據加載模塊符號圖層是其技術核心之一: 1. 通過系統符號化配置表存儲圖層符號化信息符號化圖層。 首先在關系型數據庫中創建一個圖層符號化配置表詳細記錄每一個圖層的符號化信息,如下表(我只列出簡單符號化的配置表設計,至於唯一值等大家可以自己根據需求設計):
然后使用ArcEngine提供的每種符號化類型的接口對圖層進行符號化渲染。 2. 通過ArcEngine提供的Represatation存儲要素符號化 Representation是ArcGIS9.3的新特性,能夠通過Representation制作更精美,更復雜的地圖操作過程,下圖是ArcGIS Desktop中Repre sentation工具條。
通過一下操作可以把通過Representation工具條制作出來的地圖效果存儲在要素類中(只能是Geodat abase類型的)。
從以上可以看出每一個要素的符號化信息都以Blob方式存儲在相對應的數據表中,這樣就不需要通過配置表的設置進行動態符號化,直接通過Engine中提供的與Representation相關的接口和類符號化每一個圖層。 |