ArcGIS Engine9.3的分级着色法制作专题图(转)

ArcGIS Engine9.3的分级着色法制作专题图 (转)

原文地址:http://blog.csdn.net/suinon/article/details/5700136

  分级着色法制作专题地图,一般首先从两个极值颜色生成一个颜色带,并按数值高低,赋予图元相应的颜色。ArcEngine9.3中无法使用IColorPallete、IColorSelector、IColorBrower等颜色板接口,一个可行的办法是使用.net的颜色对话框选择颜色,然后将选中颜色转换为ESRI的颜色。专题图显示后,需要带颜色带的图例才能观察,方法是,用panel控件的背景色进行设置。

程序如下:

  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.Controls;  
  10. using ESRI.ArcGIS.Carto;  
  11. using ESRI.ArcGIS.Display;  
  12. using ESRI.ArcGIS.Geodatabase;  
  13. using ESRI.ArcGIS.esriSystem;  
  14. namespace WorldMap  
  15. {  
  16.     public partial class ThematicMapForm : Form  
  17.     {  
  18.         public ThematicMapForm()  
  19.         {  
  20.             InitializeComponent();  
  21.         }  
  22.         public ThematicMapForm(IMapControl3 pMapC)  
  23.         {  
  24.             InitializeComponent();  
  25.             this.pMapControl = pMapC;//获得MapControl的引用   
  26.         }  
  27.         private IMapControl3 pMapControl;  
  28.         private IEnumColors pEnumColors;//颜色带   
  29.         private double[] classes;//断点值,两端分别是渲染字段的最小值和最大值   
  30.         private Color startColor;//低值颜色   
  31.         private Color endColor;//高值颜色   
  32.   
  33.         //在地图中添加label,参数为字段   
  34.         private void AddLabel2Map(string strField)  
  35.         {  
  36.             IGeoFeatureLayer pGeoFeatureLayer;  
  37.             ILineLabelPosition pLineLabelPosition;  
  38.             ILabelEngineLayerProperties pLabelEngineLayerProperties;  
  39.             IAnnotateLayerProperties pAnnotateLayerProperties;  
  40.             pGeoFeatureLayer = (IGeoFeatureLayer)this.pMapControl.get_Layer(4);  
  41.             pGeoFeatureLayer.AnnotationProperties.Clear();  
  42.             pLineLabelPosition = new LineLabelPositionClass();  
  43.             pLineLabelPosition.Above = false;  
  44.             pLineLabelPosition.AtEnd = false;  
  45.             pLineLabelPosition.Below = false;  
  46.             pLineLabelPosition.Horizontal = false;  
  47.             pLineLabelPosition.InLine = true;  
  48.             pLineLabelPosition.OnTop = true;  
  49.             pLineLabelPosition.Parallel = true;  
  50.             pLineLabelPosition.ProduceCurvedLabels = true;  
  51.             pLabelEngineLayerProperties = new LabelEngineLayerPropertiesClass();  
  52.             pLabelEngineLayerProperties.Symbol = new TextSymbolClass();  
  53.             pLabelEngineLayerProperties.IsExpressionSimple = true;  
  54.             pLabelEngineLayerProperties.Expression = "[" + strField + "]";//需要中括号   
  55.             pLabelEngineLayerProperties.BasicOverposterLayerProperties.LineLabelPosition = pLineLabelPosition;  
  56.             pAnnotateLayerProperties = (IAnnotateLayerProperties)pLabelEngineLayerProperties;  
  57.             pAnnotateLayerProperties.DisplayAnnotation = true;  
  58.             pAnnotateLayerProperties.FeatureLayer = pGeoFeatureLayer;  
  59.             pAnnotateLayerProperties.LabelWhichFeatures = esriLabelWhichFeatures.esriVisibleFeatures;  
  60.             pAnnotateLayerProperties.WhereClause = "";  
  61.             pGeoFeatureLayer.AnnotationProperties.Add(pAnnotateLayerProperties);  
  62.             pGeoFeatureLayer.DisplayAnnotation = true;  
  63.             this.pMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, nullnull);  
  64.         }  
  65.         //产生图例(色带+数值区间)   
  66.         private void ProduceLegend(IEnumColors pEnumColors,double[] classes)  
  67.         {  
  68.             this.panel1.Controls.Clear();  
  69.             pEnumColors.Reset();//必须重设   
  70.             IColor pC = pEnumColors.Next();//获取ESRI色带的下一个颜色   
  71.             int j = 0;  
  72.             while (pC != null)  
  73.             {  
  74.                 Panel p = new Panel();//色带用p的背景颜色表示   
  75.                 Label l = new Label();//数值区间用l的tex表示   
  76.                 p.BackColor = ColorTranslator.FromOle(pC.RGB);//ESRI颜色转换为.net颜色   
  77.                 p.BorderStyle = BorderStyle.FixedSingle;  
  78.                 p.Size = new System.Drawing.Size(88, 25);  
  79.                 p.Location = new System.Drawing.Point(5, 5 + j * 25);  
  80.                 l.Size = new System.Drawing.Size(120, 25);  
  81.                 l.Location = new System.Drawing.Point(102, 13 + j * 25);  
  82.                 l.Text = this.classes[j].ToString("#0.00") + "—" + this.classes[j + 1].ToString("#0.00");//保留两位小数   
  83.                 this.panel1.Controls.Add(p);//添加到一个panel中   
  84.                 this.panel1.Controls.Add(l);//添加到一个panel中   
  85.                 j++;  
  86.                 pC = pEnumColors.Next();  
  87.             }  
  88.         }  
  89.           
  90.         //将.net颜色转变为ESRI的颜色   
  91.         public IColor ConvertColorToIColor(Color color)  
  92.         {  
  93.             IColor pColor = new RgbColorClass();  
  94.             pColor.RGB = color.B * 65536 + color.G * 256 + color.R;  
  95.             return pColor;  
  96.         }  
  97.   
  98.         //专题图渲染(多级颜色)。参数为需要渲染的字段(数值类型),分级数目   
  99.         private void ClassBreaksMap(string strField, int numDesiredClasses)  
  100.         {  
  101.             IGeoFeatureLayer pGeoFeatureLayer;  
  102.             ITable pTable;  
  103.             IClassifyGEN pClassify;  
  104.             ITableHistogram pTableHistogram;  
  105.             IBasicHistogram pBasicHistogram;  
  106.             object dataFrequency;  
  107.             object dataValues;  
  108.             int classesCount;  
  109.             IClassBreaksRenderer pClassBreaksRenderer;  
  110.             IColor pColor;  
  111.             ISimpleFillSymbol pSimpleFillSymbol;  
  112.             int breakIndex;  
  113.             pGeoFeatureLayer = (IGeoFeatureLayer)this.pMapControl.get_Layer(4);  
  114.             pTable = (ITable)pGeoFeatureLayer.FeatureClass;  
  115.             pTableHistogram = new BasicTableHistogramClass();  
  116.             pBasicHistogram = (IBasicHistogram)pTableHistogram;  
  117.             pTableHistogram.Field = strField;  
  118.             pTableHistogram.Table = pTable;  
  119.             pBasicHistogram.GetHistogram(out dataValues, out dataFrequency);  
  120.             pClassify = new EqualIntervalClass();  
  121.             try  
  122.             {  
  123.                 pClassify.Classify(dataValues, dataFrequency, ref numDesiredClasses);  
  124.             }  
  125.             catch (Exception ee)  
  126.             {  
  127.                 MessageBox.Show(ee.Message);  
  128.             }  
  129.             classes = (double[])pClassify.ClassBreaks;  
  130.             classesCount = classes.GetUpperBound(0);  
  131.             pClassBreaksRenderer = new ClassBreaksRendererClass();  
  132.             pClassBreaksRenderer.Field = strField;  
  133.             pClassBreaksRenderer.BreakCount = classesCount;  
  134.             pClassBreaksRenderer.SortClassesAscending = true;  
  135.             pEnumColors = this.ProduceEnumColors(this.startColor, this.endColor, classesCount);//产生色带   
  136.             for (breakIndex = 0; breakIndex < classesCount; breakIndex++)  
  137.             {  
  138.                 pColor = pEnumColors.Next();  
  139.                 pSimpleFillSymbol = new SimpleFillSymbolClass();  
  140.                 pSimpleFillSymbol.Color = pColor;  
  141.                 pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;  
  142.                 pClassBreaksRenderer.set_Symbol(breakIndex, pSimpleFillSymbol as ISymbol);  
  143.                 pClassBreaksRenderer.set_Break(breakIndex, classes[breakIndex + 1]);  
  144.             }  
  145.             pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;  
  146.             this.pMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, nullnull);  
  147.         }  
  148.   
  149.         //根据起点颜色、终点颜色和级别数目,产生色带   
  150.         private IEnumColors ProduceEnumColors(Color start, Color end, int gradecount)  
  151.         {  
  152.             //创建一个新AlgorithmicColorRampClass对象   
  153.             IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();  
  154.             algColorRamp.ToColor = this.ConvertColorToIColor(end);//从.net的颜色转换   
  155.             algColorRamp.FromColor = this.ConvertColorToIColor(start);  
  156.             //设置梯度类型   
  157.             algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;  
  158.             //设置颜色带颜色数量   
  159.             algColorRamp.Size = gradecount;  
  160.             //创建颜色带   
  161.             bool bture = true;  
  162.             algColorRamp.CreateRamp(out bture);  
  163.             //使用IEnumColors获取颜色带   
  164.             return algColorRamp.Colors;  
  165.         }  
  166.   
  167.         private void button3_Click(object sender, EventArgs e)  
  168.         {  
  169.             try  
  170.             {  
  171.                 this.ClassBreaksMap("数据", 7);//按值分级渲染地图   
  172.                 this.ProduceLegend(this.pEnumColors, this.classes);//绘制图例   
  173.             }  
  174.             catch(Exception thematicE)  
  175.             {  
  176.                 MessageBox.Show(thematicE.Message+Environment.NewLine+"渲染地图错误,请重新设置!");  
  177.             }  
  178.             try  
  179.             {  
  180.                 this.AddLabel2Map("数据");  
  181.             }  
  182.             catch (Exception addLabelE)  
  183.             {  
  184.                 MessageBox.Show(addLabelE.Message + Environment.NewLine + "添加地图Label错误,请重新设置!");  
  185.             }  
  186.         }  
  187.   
  188.          
  189.         private void button4_Click(object sender, EventArgs e)  
  190.         {  
  191.             DialogResult dr = this.colorDialog1.ShowDialog();  
  192.             if (dr == DialogResult.OK)  
  193.             {  
  194.                 this.startColor = this.colorDialog1.Color;  
  195.                 this.button4.BackColor = this.startColor;  
  196.             }  
  197.         }  
  198.         private void button5_Click(object sender, EventArgs e)  
  199.         {  
  200.             DialogResult dr = this.colorDialog1.ShowDialog();  
  201.             if (dr == DialogResult.OK)  
  202.             {  
  203.                 this.endColor = this.colorDialog1.Color;  
  204.                 this.button5.BackColor = this.endColor;  
  205.             }  
  206.         }  
  207.     }  
  208. }  

 

 

效果图:

 

由于该图只有6个地区,效果不是很明显。当地区较多时,效果会比较好。

另外,分级着色法,必须保证级别数目大于等于2,当小于2时,无法正确绘制。

posted @ 2012-09-03 16:30  flylong0204  阅读(996)  评论(0)    收藏  举报