图层符号化

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

如上图所示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类的对象可以产生颜色带,这个类实现了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所示:

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); }

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

4.4.2LineSymbol对象

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

表三

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

常用的LineSymbol如下图所示:

如何创建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数据 RGBSymbol
SimpleFillSymbol 简单填充符号
TextureFillSymbol 纹理贴图填充符号

常用的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; pFillSymbol.Outline = pCartoLineSymbol;

时间: 2024-10-11 18:28:17

图层符号化的相关文章

ArcEngine应用程序中无法实现TOC图层多选

在ArcMap的内容列表中,Ctrl和Shift多选.反选等操作图层非常方便. 然而遗憾的是:经测试,查证在ArcEngine应用程序中无法使用此接口,只能通过在Desktop中来使用IContentsView接口. 如果非要实现这个功能,只能自己写一个图层目录树了,也少复杂,需要特别注意的是图层符号化的显示. 原文地址:https://www.cnblogs.com/liweis/p/9706412.html

ArcGIS Engine渲染

符号化之Renderer( 渲染)体系 ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类.接下来分别介绍FeatureRender和RasterRender. 1.FeatureRender对象    FeatureRenderer是一个抽象类,它有15个子类负责进行不同类型的着色运算.它们都实现了IFeatureRenderer接口,这个接口定义了进行要素图层符号化的公共属性和方法.    可以通过IGeoFeatureLayer::Renderer属性

ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Desktop的组成部分之一,ArcMap用于数据的浏览.编辑.显示.查询.地图排版等.ArcMap和ArcCatalog一起构成了完整的数据处理与管理分析的功能.在前一章中已经介绍了ArcCatalog的使用,本章中将介绍ArcMap的使用.本章的例子依然使用第4章里的小区平面图示例,但是将从原理的角度做更加

shapefile文件的符号化问题

我们都知道,ArcGIS的shp文件只以坐标形式保存地图数据,地图的显示方法则是存储都数据库或地图文件(mxd)中,这一点是深信不疑的. 如果我们打开ArcMap,新建一个普通的地图文件(使用标准的模板),加载一些shp文件进行,shp会进行符号化,但这个符号化是普通的,比如对于Polyline是1.0宽的,如果有多条Polyline,其颜色有所不同. 问题:为什么高速公路层和铁路层已进行了符号化,符号化的样式是保存在shp文件中?问题原帖 我将图层的名称修改后,再加入进来就不一样了:我把Arc

Arcgis Engine符号化相关

之前对于系统的符号化功能运行流程一直没梳理清楚,现在梳理总结其主要过程如下,细节不加阐述: 符号化功能主要应用的接口有两个:简单符号化ISimpleRenderer.唯一值符号化IUniqueValueRenderer 关于默认符号的两个相关点: 用IGeoFeatureLayer获取地图图层后,IGeoFeatureLayer的Render下的Symbol为默认为原有符号:而   IUniqueValueRenderer的DefaultSymbol是需要自定义的. Dim pUniqueVal

ArcMap2Sld:一个将MXD中图层配图样式转换为OGC的SLD文件的开源工具

在一个项目中,用户采用GeoServer做为GIS服务器(原因嘛当然是免费能省钱,经过验证可能还会在性能和稳定性等表现力也有优越性),但是手上收集的数据都是ESRI格式的,这倒不打紧,因为GeoServer直接能够支持ESRI的shape file和ArcSDE两种数据格式,要命的是用户的配图也是用ESRI,mxd中40个左右的图层组织和专题图样式都配好了.在网上查了大部分关于在GeoServer中发布服务的样式都是建议在uDig中重新配置,然后导出SLD文件,添加到GeoServer中.由于时

iOS Core Animation Advanced Techniques(一):图层树、寄宿图以及图层几何学

(一)图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只是Core Animation特性的冰山一角. Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中.于是这个树形成了UIKit以及在iO

geoserver 添加图层数据

1.添加shapefile文件 首先到http://www2.census.gov/geo/tiger/TIGER2011/CONCITY/上下载名称为tl_2011_47_concity的shapefile文件,并解压到本地.解压后文件列表如下: 如果不清楚shp文件对应的地理编码,可打开prj文件查看.部分内容如下: GCS_North_American_1983对应的项目编码为4269,这个编码后边会用到.在geoserver上打开"数据"-"数据存储",点击

基于AGS JS开发自定义贴图图层

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 假设一个景区有多张图片需要在地图上展示,并且随着地图的缩放而缩放(不是单纯的以气泡来展示).如果利用传统方案,则是我们首先将图片纠正赋予地理信息,然后根据地图级别进行切图,最后以瓦片的形式叠加至地图上,工作量是很大的.然而考虑到图片本身不会太大(小于3M),那么有没有其他方法来解决呢.这里我和大家一起探讨几种解决思路. 2.解决思路 2.1基于grahpic和