第四章 图层符号化
AE9.3 提供了SymbologyControl控件,用于显示ARCGIS符号库中的符号。
组件库中的组件对象分为Color(颜色),Symbol(符号),Render(渲染)三大系列,图层符号化就是通过多个组件对象来合作完成的
4.3 符号化Color(颜色)体系
4.3.1 ArcGIS 颜色模型
ArcGIS提供的颜色模型有: RGB、CMY(青、洋红、黄),HSV(色彩、纯度、明度),Gray(灰度级),HLS(色相、亮度、饱和度)
由此延伸出,Color抽象类的 5个子类:CmykColor,RGBColor,HSVColor,HLSColor,GrayColor;
AE中常用的是RGB和HSV,RGB类实现IRgbColor接口,HSV类实现IHsvColor接口
程序中常用的 GetRGB方法,就是用来构建一个RGBColor对象的
4.3.2 COlorRamp对象
一个图层有上百种颜色时,不能逐个产生,因此AE提供了ColorRamp对象
ColorRamp类的对象可以产生颜色带,实现了IColorRamp接口,它定义的属性如:Size(产生多少种颜色),Colors(颜色带IEnumColor)
ColorRamp类是一个抽象类,子类包括4种:
RandomColorRamp(随机颜色带):使用HSV颜色模型来确定一串颜色;
PresetColorRamp(预设颜色带):预设的颜色模式,可存储13种颜色;
AlgorithmicColorRamp(起止颜色带):用起始颜色、终止颜色确定一个颜色带,起始、终止颜色使用HSV模型
MultiPartColorRamp(叠加颜色带):叠加产生颜色带
生成颜色带实例: 接下来制作一个实例演示AlgorithmicColorRamp的Demo:
在WinForm窗体中,创建如下界面:
接下来编写如下代码:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using ESRI.ArcGIS.Display; 10 11 namespace TM_A_Project 12 { 13 public partial class AlgorithmicColorRamp演示 : Form 14 { 15 public AlgorithmicColorRamp演示() 16 { 17 InitializeComponent(); 18 } 19 20 private void btnCreateColorRamp_Click(object sender, EventArgs e) 21 { 22 // 创建一个新AlgorithmicColorRampClass对象 23 IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass(); 24 // 创建起始颜色对象 25 IRgbColor startColor = GetRGBColor(255, 0, 0); 26 27 // 创建终止颜色 28 IRgbColor endColor = GetRGBColor(0, 255, 0); 29 30 // 设置AlgorithmicColorRampClass的起止颜色属性 31 algColorRamp.ToColor = startColor; 32 algColorRamp.FromColor = endColor; 33 // 设置梯度类型 34 algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm; 35 // 设置颜色带颜色数量 36 algColorRamp.Size = 5; 37 // 创建颜色带 38 bool bture = true; 39 algColorRamp.CreateRamp(out bture); 40 // 使用IEnumColors获取颜色带 41 IEnumColors pEnumColors = null; 42 pEnumColors = algColorRamp.Colors; 43 // 设置5个picturebox的背景色为产生颜色带的5个颜色 44 this.pictureBox1.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB); 45 this.pictureBox2.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB); 46 this.pictureBox3.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB); 47 this.pictureBox4.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB); 48 this.pictureBox5.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB); 49 } 50 51 private IRgbColor GetRGBColor(int r, int g, int b) 52 { 53 IRgbColor rgbColor = new RgbColorClass(); 54 rgbColor.Red = r; 55 rgbColor.Green = g; 56 rgbColor.Blue = b; 57 return rgbColor; 58 } 59 } 60 }
执行效果如下图所示:
RandomColorRamp对象产生随机颜色带,RandomColorRamp也需要设定一个范围,但这个范围是HSV颜色模型的,颜色将在这个范围内随机出现
RandomColorRamp实现了 IRandomColorRamp接口。
以下是生成RandomColorRamp的代码段:
1 // 以下是生成RandomColorRamp的代码段 2 public void CreateRandomColorRamp() 3 { 4 IRandomColorRamp pRandomColorRamp = new RandomColorRampClass(); 5 // 制作一系列介于橘黄色和蓝绿色之间的随机颜色 6 pRandomColorRamp.StartHue = 40; 7 pRandomColorRamp.EndHue = 120; 8 pRandomColorRamp.MinValue = 65; 9 pRandomColorRamp.MaxValue = 90; 10 pRandomColorRamp.MinSaturation = 25; 11 pRandomColorRamp.MaxSaturation = 45; 12 pRandomColorRamp.Size = 20; 13 pRandomColorRamp.Seed = 23; 14 bool btrue = true; 15 pRandomColorRamp.CreateRamp(out btrue); 16 17 IEnumColors pEnumColors = pRandomColorRamp.Colors; 18 19 // 接下来对pEnumColors进行操作即可 pEnumColors.Next().RGB 20 }
4.4 符号化Symbol体系
AE9.3 为开发人员提供了32种符号,主要分为三大类:
1) MarkerSymbol(点符号),LineSymbol(线符号)和FillSymbol(填充符号)来绘制地理要素的几何图形
2)TextSymbol ,用于文字标注
3) 3D Chart 符号,用于显示饼图等三维对象
4.4.1 MarkerSymbol 对象
MarkerSymbol 用于修饰点对象的符号,它拥有13个子类,不同子类用于产生不同类型的点符号。
所有的MarkerSymbol类都实现了IMarkerSymbol接口,该接口定义了标记符号的方法、属性,如 角度、颜色、大小和X,Y偏移量等
以下代码段用来创建 SimpleMarkerSymbol 类型符号
1 public void CreateSimpleMarkerSymbol() 2 { 3 // 创建SimpleMarkerSymbolClass对象 4 ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass(); 5 // 创建RgbColorClass对象为SimpleMarkerSymbol设置颜色 6 IColor pRgbColor = GetRgbColor(255, 0, 0); 7 pSimpleMarkerSymbol.Color = pRgbColor; 8 // 设置pSimpleMarkerSymbol对象的符号类型,选择钻石 9 pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond; 10 // 设置pSimpleMarkerSymbol对象大小,设置为5 11 pSimpleMarkerSymbol.Size = 5; 12 // 显示外框线 13 pSimpleMarkerSymbol.Outline = true; 14 // 为外框线设置颜色 15 pSimpleMarkerSymbol.OutlineColor = GetRgbColor(0, 255, 0); 16 // 设置外框线的宽度 17 pSimpleMarkerSymbol.OutlineSize = 1; 18 }
在介绍Renderer对象时,会演示 用创建的点符号去 符号化一个图层。
4.4.2 LineSymbol 对象
LineSymbol对象,用于修饰线性几何对象的符号。它拥有8个子类,用于产生不同类型的线符号。
实现了ILineSymbol接口,该接口包含Color和Width属性
以下代码段,演示如何创建一个MakerLineSymbol线符号:
1 public void CreateLineSymbol() 2 { 3 IArrowMarkerSymbol pArrowMarker = new ArrowMarkerSymbolClass(); 4 pArrowMarker.Color = GetRgbColor(255, 0, 0); 5 pArrowMarker.Length = 10; 6 pArrowMarker.Width = 8; 7 pArrowMarker.Style = esriArrowMarkerStyle.esriAMSPlain; 8 9 IMarkerLineSymbol pMarkerLine = new MarkerLineSymbolClass(); 10 pMarkerLine.MarkerSymbol = pArrowMarker; 11 pMarkerLine.Color = GetRgbColor(0, 0, 255); 12 13 }
4.4.3 FillSymbol 对象
FillSymbol对象,用来修改如多边形等具有面积的几何形体的符号对象,有11个子类,实现了IFillSymbol接口,有Color和OutLine属性
以下代码段,演示如何创建一个SimpleFillSymbol线符号:
1 public void CreateFillSymbol() 2 { 3 // 为填充符号创建外框线符号 4 ICartographicLineSymbol pCartoLineSymbol = new CartographicLineSymbolClass(); 5 pCartoLineSymbol.Width = 2; 6 pCartoLineSymbol.Color = GetRgbColor(255, 0, 0); 7 // 创建一个填充符号 8 ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass(); 9 // 设置填充符号的属性 10 IFillSymbol pFillSymbol = pSimpleFillSymbol; 11 pFillSymbol.Color = GetRgbColor(0, 255, 0); 12 pFillSymbol.Outline = pCartoLineSymbol;// 设置边框线 13 }
4.4.4 TextSymbol 对象
TextSymbol对象,用于修饰文字元素,文字元素在要素标注等方面很有用。
TextSymbol符号最重要的设置对象是它的字符,它实现了三个主要的接口来设置字符:ITextSymbol、ISimpleTextSymbol和IFormattedTextSymbol
ITextSymbol: 是定义文本字符样式额主要接口,它定义的ITextSymbol::Font属性,是产生一个TextSymbol符号的关键,
可以使用IFontDisp接口来设置字体的大小和是否是粗体、倾斜等属性,
ITextSymbol接口还可以定义TextSymbol对象的颜色、角度、水平排列方式、垂直排列方式和文本等内容。
以下是一个构建TextSymbol 的函数:
1 ///2 /// 生成文本符号 3 /// 4 /// 文本符号 5 /// 字体名称 6 /// 字体大小 7 /// 字体颜色 8 public void MakeTextSymbol(ref ITextSymbol pTxtSymbol, string sFontName, int iFont, int iColor) 9 { 10 try 11 { 12 pTxtSymbol.Font.Name = sFontName; 13 pTxtSymbol.Font.Size = (decimal)iFont; 14 IRgbColor pRgbColor = new RgbColorClass(); 15 pRgbColor.RGB = iColor; 16 pTxtSymbol.Color = (IColor)pRgbColor; 17 pTxtSymbol.Angle = 0; 18 pTxtSymbol.RightToLeft = false; 19 pTxtSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter; 20 pTxtSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; 21 } 22 catch (Exception) 23 { 24 throw; 25 } 26 }
4.4.5 3DChartSymbol 对象
3DChartSymbol 是一个抽象类,子类有:BarChart,PieChart和StackedChart
BarChartSymbol 是最常用的三维着色符号,不同类型的柱子代表一个要素类中不同的属性,柱子的高度取决于属性值的大小
PieChartSymbol 符号进行着色的方法是使用一个饼图来显示不同要素类中的不同属性,不同的属性按照他们的数值大小战友一个饼图中的不同比例的扇形区域
4.5 使用ServerStyle符号库
在ArcGIS Desktop中,我们使用的是Style符号库,相对应的在AE开发中,就是ServerStyle符号库
如何获取符号库中的符号? 举个栗子: 获取ESIR符号库中名称为Rose的符号:
1、首先构建一个ServerStyleGallery对象
2、其次使用IStyleGalleryStorage接口的AddFile()方法,加载ServerStyle文件(接口对象AddFile()方法会得到ServerStyleGallery对象?)
3、遍历ServerGallery中的Class,如果是FIllSymbol,则使用IStyleGallery的GetItems()方法,
返回一个可枚举的包含一系列StyleGalleryItem的EnumStyleGalleryItem对象
4、遍历EnumServerStyleGalleryItem枚举对象中的StyleGalleryItem如果名称是Rose,即可获取ESRI符号库中名称为Rose的StylegalleryITem
5、然后通过IStyleGalleryItem的ITem属性即可转换为Isymbol。
4.6 SymbologyControl控件
SymbologyControl用来显示ServerSTyle符号库中的符号样式,可以选择在该控件上选择一个符号用来符号化一个图层或者作为一个Element的符号
使用SymbologyControl可以再设计的模式下,再其属性页中加载ServerStyle符号库文件,
同样,可以使用LoadStyleFile和RemoveFile方法加载和移除ServerStyle符号库文件
4.7 符号化 之 Renderer(渲染)体系
AE 9.3 对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类:FEatureRender和RasterRender
4.7.1 FeatureRender对象:
抽象类,有15个子类,负责进行不同类型的着色运算。
都实现了IFeatureRenderer接口,该接口定义了 进行要素图层符号化的公共属性和方法
通过IGeoFeatureLayer.Renderer属性,获取一个要素图层的符号化对象。
4.7.2 RasterRender 对象:
抽象类,有15个子类,负责进行不同类型的着色运算。
都实现了IRasterRender接口,该接口定义了栅格图层符号化的公共属性和方法。
可通过IRasterLayer::Renderer属性获得一个栅格图层的符号化对象
以下代码段,对一个RasterLayer进行RasterStrechColorRampRenderer(色带 渲染)符号化操作:
1 ///2 /// StretchColorRamp符号化RasterLayer 3 /// 4 /// 5 public void SetStretchColorRampRenderer(IRasterLayer pRasterLayer) 6 { 7 try 8 { 9 // 创建RasterStretchColorRampRendererClass对象 10 IRasterStretchColorRampRenderer pRStretchRender = new RasterStretchColorRampRendererClass(); 11 // QI到IRasterRenderer 12 IRasterRenderer pRasterRender = pRStretchRender as IRasterRenderer; 13 pRasterRender.Raster = pRasterLayer as IRaster;// 将栅格要素图层设置到 作为 栅格渲染的对象上 14 pRasterRender.Update(); 15 // 创建两个起始颜色 16 IRgbColor pFromRgbColor = new RgbColorClass(); 17 pFromRgbColor.Red = 255; 18 IRgbColor pToRgbColor = new RgbColorClass(); 19 pToRgbColor.Blue = 255; 20 21 // 创建起止颜色带 22 IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass(); 23 pAlgorithmicColorRamp.Size = 255; 24 pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor; 25 pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor; 26 bool btrue = true; 27 pAlgorithmicColorRamp.CreateRamp(out btrue); 28 // 选择拉伸颜色带符号化所采用的颜色带(通过颜色带进行渲染操作) 29 pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp; 30 pRasterRender.Update(); 31 pRasterLayer.Renderer = pRasterRender; 32 } 33 catch (Exception) 34 { 35 throw; 36 } 37 }
下一篇将介绍:《利用ESRI自带的符号库进行唯一值符号化:图层开发实例》