ArcGIS Engine— 学习图层符号化

来源:互联网 发布:网络监控手机怎么设置 编辑:程序博客网 时间:2024/03/29 19:24

      地图符号不仅具有确定的空间位置以及空间地物的性质:例如在一个城市管线系统中不同的线符号表示不同类型的管线,不同的点符号表示不同类型的设备等等,而且地图符号也可以表达与空间位置相关的丰富信息:例如人口密度符号可以直观的表示人口数量的空间分布情况。所以地图数据的符号化决定着地图以何种“面目”展现给地图的使用者,自此空间数据的符号化对GIS开发有非常重要的意义。

      ArcGIS Engine9.3提供了丰富的控件和组件库来实现图层符号化的相关功能。ArcGIS Engine9.3提供了SymbologyControl控件用于显示ArcGIS符号库中的符号(关于ArcGIS符号请查找相关文档),而组件库中的组件对象分为Color , Symbol, Renderer三大系列,图层符号化就是通过多个组件对象来合作完成。

4.1目标

1.熟悉ArcGIS Engine符号化之Color(颜色)体系

2.熟悉ArcGIS Engine符号化之Symbol(符号)体系

3.熟悉ArcGIS Engine符号化之Renderer( 渲染)体系

4.利用ESRI自带的符号库进行符号化图层
4.2准备工作

1.IDE:Visual Studio 2005/2008

2.ArcGIS Engine Developer kit 9.3

3.自造一份用于唯一值符号化的点数据(文章内有说明)

4.3符号化Color(颜色)体系
4.3.1ArcGIS颜色模型

ArcGIS提供Color(颜色)的模型有多种分别是:

  • RGB颜色模型:最常用,所有颜色都是通过红色(Red)、绿色(Green)、蓝色(Blue)这三原色的混合来显示。

  • CMY颜色模型:青(Cyan)、洋红(Magenta)和黄(Yellow)三种颜色的简写,是相减混色模式,用这种方法产生的颜色之所以称为相减色,主要用于印刷中。

  • HSV颜色模型:色彩(H),纯度(S),明度(V)。

  • Gray模型:没有彩色的,灰度图像由8位信息组成,并使用256级的灰色来模拟颜色层次。

  • HLS模型: Hue(色相)、Luminance(亮度)、Saturation(饱和度)。

 

图1

如上图所示Color对象是一个抽象类,它包括5个子类:它有5个颜色子类,即CmykColor、RGBColor、HSVColor、HLSColor和GrayColor,它们可以使用IColor接口定义的方法设置颜色对象的基本属性。在ArcGIS engine中最常使用的两种颜色模型是RGB和HSV,RGB类实现IRgbColor接口,而HSV类则实现IHsvColor接口,两个接口分别定义了设置一个RGBColor对象和RGBColor对象需传递的值。

接下来以一个函数来通过R,G,B值来构建一个RGBColor对象

复制代码
代码
private IRgbColor GetRGB(int r,int g,int b)

{
IRgbColor pRgbColor
= new RgbColorClass();//构建一个RgbColorClass
pRgbColor.Red = r;//设置Red属性
pRgbColor.Green = g;//设置Green属性
pRgbColor.Blue = b;//设置Blue属性
return pRgbColor;

}
复制代码

4.3.2ColorRamp对象

在地图符号化的过程中,需要的颜色常常不是一种,而是随机或有序产生的一组颜色。如果对某一个图层进行符号化需要上百种颜色如图2所示,程序开发者肯定不能逐个产生出来。ArcGIS Engine提供了ColorRamp对象:
 
图2

ColorRamp类的对象可以产生颜色带,这个类实现了IColorRamp接口,它定义了一系列颜色带的属性,如 Size(产生多少种颜色),Colors(颜色带 IEnumColor)。
ColorRamp类是一个抽象类,它包括4个子类分别是:RandomColorRamp(随机颜色带)、PresetColorRamp(预设颜色带)、AlgorithmicColorRamp(起止颜色带)、MultiPartColorRamp(叠加颜色带),它们的说明如表一所示。

表一

RandomColorRamp使用HSV颜色模型来确定一串颜色PresetColorRamp预设的颜色模式,可存储13种颜色AlgorithmicColorRamp用起始颜色、终止颜色确定一个颜色带,起始、终止颜色使用HSV模型MultiPartColorRamp叠加产生颜色带

 在GIS应用开发中用到比较多得是RandomColorRamp(随机颜色带)和AlgorithmicColorRamp(起止颜色带)接下来详细介绍一下这两个颜色带。
AlgorithmicColorRamp是通过起止颜色来确定多个在这两个颜色之间的色带。AlgorithmicColorRamp类实现了两个接口:IColorRamp和IAlgorithmicColorRamp,两个接口之间是接口继承关系,后者包含了前者所有的方法和属性。
4.3.3生成颜色带实例
   接下来制作一个实例演示AlgorithmicColorRamp(起止颜色带)的Demo:
1.创建一个窗体,在窗体上添加5个Picturebox用于分别显示产生的包含5个颜色的起始颜色带中的颜色,如图3所示:

3

2.在“生成颜色带”Button的Click事件中生成颜色带,代码片段如下所示:

 

private void button1_Click(object sender, EventArgs e)
{
//创建一个新AlgorithmicColorRampClass对象
IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();
//创建起始颜色对象
IRgbColor startColor = new RgbColor();
startColor.Red 
= 255;
startColor.Green 
= 0;
startColor.Blue 
= 0;
//创建终止颜色对象
IRgbColor endColor = new RgbColor();

endColor.Red 
= 0;
endColor.Green 
= 255;
endColor.Blue 
= 0;
//设置AlgorithmicColorRampClass的起止颜色属性
algColorRamp.ToColor = startColor;
algColorRamp.FromColor 
= endColor;
//设置梯度类型
algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;

//设置颜色带颜色数量
algColorRamp.Size = 5;

//创建颜色带

bool bture = true;
algColorRamp.CreateRamp(
out bture);
//使用IEnumColors获取颜色带

IEnumColors pEnumColors 
= null;
pEnumColors 
= algColorRamp.Colors;

//设置5个picturebox的背景色为产生颜色带的5个颜色

this.pictureBox1.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox2.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox3.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox4.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox5.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
}


 

4

RandomColorRamp对象产生随机颜色带,RandomColorRamp也需要设定一个范围,但是这个范围是HSV颜色模型的,颜色将在这个范围内随机出现。 RandomColorRamp类实现了IRandomColorRamp接口
以下是生成RandomColorRamp的代码片段:

 

IRandomColorRamp pRandomColorRamp = new RandomColorRampClass(); 

//** 制作一系列介于橘黄色和蓝绿色之间的随机颜色
pRandomColorRamp.StartHue = 40;
pRandomColorRamp.EndHue 
= 120;
pRandomColorRamp.MinValue 
= 65
pRandomColorRamp.MaxValue 
= 90;
pRandomColorRamp.MinSaturation 
= 25;
pRandomColorRamp.MaxSaturation 
= 45;
pRandomColorRamp.Size 
= 20;
pRandomColorRamp.Seed 
= 23;
bool bture = true;
pRandomColorRamp.CreateRamp(
out bture);
IEnumColors pEnumColors 
= pRandomColorRamp.Colors 

//** 对pEnumColors进行操作

4.4符号化Symbol(符号)体系
ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大类符号MarkerSymbol(点符号)、 LineSymbol(线符号)和FillSymbol(填充符号)来绘制地理要素的几何图形。此外还有两种特殊类型的符号:一种是TextSymbol用于文字标注;另一种是3D Chart符号,用于显示饼图等三维对象,如需详细了解请查找帮助文档。
4.4.1MarkerSymbol对象
MarkerSymbol用于修饰点对象的符号,它拥有十三个子类如表2所示,其中不同的子类可以产生不同类型的点符号。所有的MarkerSymbol类都实现了IMarkerSymbol接口,这个接口定义了标记符号的公共方法和属性,如角度、颜色、大小和X,Y偏移量等。

表二


点符号类型描述ArrowMarkerSymbol预定义的肩头符号BarChartSymbol柱状图符号CharacterMarker3DSymbol三维字体符号CharacterMarkerSymbol字体符号Marker3DSymbol3D符号MultiLayerMarkerSymbol多个符号叠加产生新点符号PictureMarkerSymbol图片符号(bmpemf)PiechartSymbol饼图符号SimpleMarker3DSymbol简单3D符号SimpleMarkerSymbol简单符号StackedChartSymbol堆叠符号TextMarkerSymbol文字符号用来符号化点  

常用的有以下5种 类型:

图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对象的时候将为大家演示如何用创建的点符号去符号化一个图层。

4.4.2LineSymbol对象

LineSymbol对象是用于修饰线型几何对象的符号,它拥有八个子类如表3所示,其中不同的子类可以产生不同类型的线符号,所有的LineSymbol类都实现了ILineSymbol接口, ILineSymbol定义了两个公共属性:Color和Width。

 

表三

线符号类型描述CartographicLineSymbol实心或者虚线线符号HashLineSymbol离散线符号MarkerLineSymbol点线符号MultiLayerLineSymbol多符号叠加产生新线符号PictureLineSymbol图片线符号SimpleLine3DSymbol3D线符号SimpleLineSymbol预定义风格的线符号TextureLineSymbol (3DAnalyst)纹理贴 图线符号

 常用的LineSymbol如下图所示:

 
  图6

如何创建LineSymbol?接下来以MarkerLineSymbol构建为例演示如何创建一个线符号:

代码
IArrowMarkerSymbol pArrowMarker = new ArrowMarkerSymbolClass();
IRgbColor pRgbColor 
= new RgbColorClass();
pRgbColor.Red 
= 255;
pArrowMarker.Color 
= pRgbColor as IColor; 
pArrowMarker.Length 
= 10;
pArrowMarker.Width 
= 8;
pArrowMarker.Style 
= esriArrowMarkerStyle.esriAMSPlain;
IMarkerLineSymbol pMarkerLine 
= new MarkerLineSymbolClass();
pMarkerLine.MarkerSymbol 
= arrowMarker;
IRgbColor pLineColor 
= new RgbColorClass();
pLineColor.Blue 
= 255;
pMarkerLine.Color 
= pLineColor as IColor;

4.4.3FillSymbol对象

FillSymbol是用来修饰如多边形等具有面积的几何形体的符号对象,它拥有十一个子类如表4所示它实现了IFillSymbol,这个接口定义了两个属性Color和OutLine,以满足所有类型的FillSymbol对象的公共属性设置。

表四

填充符号类型描述ColorRampSymbol (Carto)用于渲染Raster数据的颜色带ColorSymbol (Carto)用于渲染Raster数据的颜色符号DotDensityFillSymbol点密度填充符号GradientFillSymbol渐变填充符号LineFillSymbol包含线符号的填充符号MarkerFillSymbol包含点符号的填充符号MultiLayerFillSymbol多符号叠加产生新填充符号PictureFillSymbol图片填充符号RasterRGBSymbol用于渲染Raster数据 RGBSymbolSimpleFillSymbol简单填充符号TextureFillSymbol纹理贴图填充符号

常用的FillSymbol如下图所示:


                                                               图7

如何创建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;
pFillSymbol.Outline 
= pCartoLineSymbol;

复制代码