[转] ArcEngine 产生专题图

简介:

小生原文 ArcEngine 产生专题图

ArcEngine提供多个着色对象用于产生专题图,可以使用标准着色方案,也可以自定义着色方案,ArcEngine提供8中标准着色方案。

一、SimpleRenderer专题图

是使用单一符号进行着色分类,不涉及对要素的数据进行处理。这种专题图同一个图层内的所有元素都是一种符号。

通过SimpleRenderer对象对Symbol进行设置后,赋予IGeoFeatureLayer接口的Renderer属性,对象实现了ITransparencyRenerer接口,通过该接口的属性,可以根据要素的某一个数值字段来设置要素显示的透明度。

该对象还实现了ISimpleRenderer接口,提供了两个重要的属性:Description和Label这两个属性用来设置图例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/// <summary>
         /// 简单渲染
         /// </summary>
         /// <param name="layerName">图层名字</param>
         /// <param name="FillStyle">FillStyle</param>
         /// <param name="pColor">FillColor</param>
         /// <param name="OutLineColor">OutLineColor</param>
         /// <param name="RenderLabel">样式名称注释</param>
         /// <param name="Descripition">描述</param>
         public  void  createSimpleFillSymbol( string  layerName,esriSimpleFillStyle FillStyle,IColor pColor,IColor OutLineColor, string  RenderLabel, string  Descripition)
         {
             //简单填充符号
             ISimpleFillSymbol simpleFillSymbol =  new  SimpleFillSymbolClass();
             //可以用符号选择器进行
             simpleFillSymbol.Style = FillStyle;
             simpleFillSymbol.Color = pColor;
             //创建边线符号
             ISimpleLineSymbol simpleLineSymbol =  new  SimpleLineSymbolClass();
             simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
             simpleLineSymbol.Color = OutLineColor;
             ISymbol symbol = simpleLineSymbol  as  ISymbol;
             symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
             simpleFillSymbol.Outline = simpleLineSymbol;
 
             ISimpleRenderer simpleRender =  new  SimpleRendererClass();
             simpleRender.Symbol = simpleFillSymbol  as  ISymbol;
             simpleRender.Label = RenderLabel;
             simpleRender.Description = Descripition;
 
             IGeoFeatureLayer geoFeatureLayer;
             geoFeatureLayer = getGeoLayer(layerName);
             if  (geoFeatureLayer !=  null )
             {
                 geoFeatureLayer.Renderer = simpleRender  as  IFeatureRenderer;
             }
         }

 

二、ClassBreakRenderer专题图

为分级专题图,通过要素图层中要素的某个数值字段的值,根据用户要求,将这些值分为多个级别,每个级别用不同的Symbol显示。

该对象实现了IClassBreakRenderer接口,提供了实现分级显示的属性和方法,如Field属性用于设置分级着色的字段,BreakCount属性用于设置分级的数目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/// <summary>
         /// 分级渲染
         /// </summary>
         /// <param name="layerName">图层名</param>
         /// <param name="classCount">分级数目</param>
         /// <param name="ClassField">分级字段</param>
         /// <param name="FillStyle">填充样式</param>
         public  void  createClassBreakRender( string  layerName,  int  classCount,  string  ClassField, esriSimpleFillStyle FillStyle)
         {
             //int classCount = 6;
             ITableHistogram tableHistogram; //表格直方图
             IBasicHistogram basicHistogram; //Provides access to members that control histogram objects created from different data sources.
 
             ITable table;
             IGeoFeatureLayer geoFeatureLayer;
             geoFeatureLayer = getGeoLayer(layerName);
             ILayer layer = geoFeatureLayer  as  ILayer;
             table = layer  as  ITable;
             tableHistogram =  new  BasicTableHistogramClass();
             //按照 数值字段分级
             tableHistogram.Table = table;
             tableHistogram.Field = ClassField;
             basicHistogram = tableHistogram  as  IBasicHistogram;
             object  values;
             object  frequencys;
             //先统计每个值和各个值出现的次数
             basicHistogram.GetHistogram( out  values,  out  frequencys);
             //创建平均分级对象
             IClassifyGEN classifyGEN =  new  QuantileClass();
             //用统计结果进行分级 ,级别数目为classCount
             classifyGEN.Classify(values, frequencys,  ref  classCount);
             //获得分级结果,是个 双精度类型数组
             double [] classes;
             classes = classifyGEN.ClassBreaks  as  double [];
             //定义不同等级渲染的色带用色
             IEnumColors enumColors = CreateAlgorithmicColorRamp(classes.Length).Colors;
             IColor color;
 
             IClassBreaksRenderer classBreaksRenderer =  new  ClassBreaksRendererClass();
             classBreaksRenderer.Field = ClassField;
             classBreaksRenderer.BreakCount = classCount; //分级数目
             classBreaksRenderer.SortClassesAscending =  true ; //定义分类是否在TOC中显示Legend
 
             ISimpleFillSymbol simpleFillSymbol;
             for  ( int  i = 0; i < classes.Length - 1; i++)
             {
                 color = enumColors.Next();
                 simpleFillSymbol =  new  SimpleFillSymbolClass();
                 simpleFillSymbol.Color = color;
                 simpleFillSymbol.Style = FillStyle;
 
                 classBreaksRenderer.set_Symbol(i, simpleFillSymbol  as  ISymbol);
                 classBreaksRenderer.set_Break(i, classes[i]);
             }
             if  (geoFeatureLayer !=  null )
             {
                 geoFeatureLayer.Renderer = classBreaksRenderer  as  IFeatureRenderer;
             }
            
         }

 

三、UniqueValueRenderer专题图

是依据要素图层中的某个字段的不同值,给每个要素一个单独的颜色,以区分存在的每一个要素。

UniqueValueRenderer实现了IUniqueValueRenderer接口,提供了各种属性和方法,如AddValue方法用于将单个要素的某个字段值和与之相匹配的着色符号加入到UniqueValueRenderer对象。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/// <summary>
         /// 单一值渲染(单字段)
         /// </summary>
         /// <param name="layerName">图层名</param>
         /// <param name="RenderField">渲染字段</param>
         /// <param name="FillStyle">填充样式</param>
         /// <param name="valueCount">字段的唯一值个数</param>
         public  void  createUniqueValueRander( string  layerName,  string  RenderField, esriSimpleFillStyle FillStyle, int  valueCount)
         {
             IGeoFeatureLayer geoFeatureLayer;
             geoFeatureLayer = getGeoLayer(layerName);
             IUniqueValueRenderer uniqueValueRenderer =  new  UniqueValueRendererClass();
             //可以设置多个字段
             uniqueValueRenderer.FieldCount = 1; //0-3个
             uniqueValueRenderer.set_Field(0, RenderField);
 
             //简单填充符号
             ISimpleFillSymbol simpleFillSymbol =  new  SimpleFillSymbolClass();
             simpleFillSymbol.Style = FillStyle;
 
             IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search( null false );
             IFeature feature;
 
             if  (featureCursor !=  null )
             {
                 IEnumColors enumColors = CreateAlgorithmicColorRamp(valueCount).Colors;
                 int  fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField(RenderField);
                 for  ( int  i = 0; i < valueCount; i++)
                 {
                     feature = featureCursor.NextFeature();
                     string  nameValue = feature.get_Value(fieldIndex).ToString();
                     simpleFillSymbol =  new  SimpleFillSymbolClass();
                     simpleFillSymbol.Color = enumColors.Next();
                     uniqueValueRenderer.AddValue(nameValue, RenderField, simpleFillSymbol  as  ISymbol);
                 }
             }
 
             geoFeatureLayer.Renderer = uniqueValueRenderer  as  IFeatureRenderer;
         }
         /// <summary>
         ///  单一值渲染(多字段)
         /// </summary>
         /// <param name="layerName">图层名</param>
         /// <param name="RenderField">多字段名</param>
         /// <param name="FillStyle">样式</param>
         /// <param name="valueCount">每个字段中唯一值的个数</param>
         public  void  createUniqueValueRander( string  layerName,  string [] RenderField, esriSimpleFillStyle FillStyle,  int [] valueCount)
         {
             IGeoFeatureLayer geoFeatureLayer;
             geoFeatureLayer = getGeoLayer(layerName);
             IUniqueValueRenderer uniqueValueRenderer =  new  UniqueValueRendererClass();
             //可以设置多个字段
             uniqueValueRenderer.FieldCount = RenderField .Length; //0-3个
             for  ( int  i = 0; i < RenderField.Length; i++)
             {
                 uniqueValueRenderer.set_Field(i, RenderField[i]);
             }
 
             //简单填充符号
             ISimpleFillSymbol simpleFillSymbol =  new  SimpleFillSymbolClass();
             simpleFillSymbol.Style = FillStyle;
 
             IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search( null false );
             IFeature feature;
 
             if  (featureCursor !=  null )
             {
                 for  ( int  i = 0; i < RenderField.Length; i++)
                 {
                     IEnumColors enumColors = CreateAlgorithmicColorRamp(valueCount[i]).Colors;
                     int  fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField(RenderField[i]);
                     for  ( int  j = 0; j < valueCount[i]; j++)
                     {
                         feature = featureCursor.NextFeature();
                         string  nameValue = feature.get_Value(fieldIndex).ToString();
                         simpleFillSymbol =  new  SimpleFillSymbolClass();
                         simpleFillSymbol.Color = enumColors.Next();
                         uniqueValueRenderer.AddValue(nameValue, RenderField[i], simpleFillSymbol  as  ISymbol);
                     }
                 }
             }
             geoFeatureLayer.Renderer = uniqueValueRenderer  as  IFeatureRenderer;
         }

 

四、ProportionalSymbolRenderer专题图

使用梯度着色法制作的专题图。

ProportionalSymbolRenderer实现了IProportionalSymbolRenderer接口。

这种着色法需要用户知道最大和最小点各自代表的字段值、着色基于的字段和着色点使用的符号以及它在Legend要出现的级别数目。

 

  View Code

五、ChartRenderer专题图

使用一个饼图或柱图来表示一个要素的多个属性。有水平排列和累计排列两种。

ChartRenderer对象实现了IChartRenderer接口,其中ChartSymbol方法用于设置着色对象的着色符号,Label属性用于设置Legend的标签。

该方法用于比较一个要素中不同属性,在获得着色图层的单个或多个字段时用RendererField对象来操作。该类实现了IRendererField接口,可以通过AddField方法来添加字段。

该着色法是使用饼图来表现要素的多个属性之间的比率关系。该对象实现了IPicChartRenderer接口,使用PieChartSymbol符号来修饰要素。

  View Code

 

六、DotDensityRenderer专题图

DotDensityRenderer对象使用DotDensityFillSymbol符号对Polygon类型的要素进行着色。该专题图使用随机分布的点的密度来表现要素某个属性值得大小。也可以对图层的多个属性值着色,通过指定不同的点符号来区分。

DotDensityRenderer对象实现IDotDensityRenderer接口,定义了使用点密度着色方法和属性,如DotDensitySymbol用于确定着色点符号,CreateLegend方法用于产生图例。

  View Code

此外还有两个补充方法(在调用这些方法的时候能用到):

  View Code

 

 

 

 

 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5903526.html,如需转载请自行联系原作者


相关文章
|
5月前
|
编解码 定位技术
ArcGIS中ArcMap绘制多框幅论文文献研究区域概况介绍示意图
ArcGIS中ArcMap绘制多框幅论文文献研究区域概况介绍示意图
|
5月前
Visio绘制论文文献技术路线图流程图
Visio绘制论文文献技术路线图流程图
|
10月前
|
编解码 数据可视化 定位技术
ArcGIS应用基础4 专题图的制作
😉🏆🏆在本文中,作者以人口密度图为例,详细讲解了基于ArcGIS布局视图下专题图制作的流程,介绍了地图要素的配置。
115 0
ArcGIS应用基础4 专题图的制作
|
机器学习/深度学习 监控 算法
绘制森林资源图的工具介绍
绘制森林资源图的工具介绍
98 0
绘制森林资源图的工具介绍
|
编解码 定位技术
ArcGIS制作论文研究区域示意图的方法
本文介绍基于ArcMap软件,绘制论文中研究区域示意图、概况图等的方法~
1063 1
ArcGIS制作论文研究区域示意图的方法
|
应用服务中间件 nginx Linux
|
存储 定位技术 容器