基于C#的AE二次开发-地图渲染之分级设色符号化
我的开发环境为 10.2与 。主地图名称为,Toc目录名为,创建一个菜单或按钮,创建一个点击事件,粘贴代码修改图层与渲染字段即可实现。(注意相关事件的添加与动态链接库的引入)!
效果预览:
实现代码:
private void 分级设色符号化ToolStripMenuItem_Click(object sender, EventArgs e)
{try{//输入分级设色符号化的图层(我这里默认第一个图层【高耦合】)IFeatureLayer pFeatLyr = axMapControl1.get_Layer(0) as IFeatureLayer;//输入分级设色符号化的字段(我这里默认FID字段【高耦合,分级设色字段需为数值型】)string sFieldName = "FID";//要素类中数值型字段的名称//输入分级设色的数量int numclasses = 3;IGeoFeatureLayer pGeoFeatureL = pFeatLyr as IGeoFeatureLayer;object dataFrequency;object dataValues;bool ok;int breakIndex;ITable pTable = pGeoFeatureL.FeatureClass as ITable;ITableHistogram pTableHistogram = new BasicTableHistogram() as ITableHistogram;IBasicHistogram pBasicHistogram = (IBasicHistogram)pTableHistogram;pTableHistogram.Field = sFieldName;pTableHistogram.Table = pTable;pBasicHistogram.GetHistogram(out dataValues, out dataFrequency); //获取渲染字段的值及其出现的频率IClassifyGEN pClassify = new EqualInterval();try{pClassify.Classify(dataValues, dataFrequency, ref numclasses); //根据获取字段的值和出现的频率对其进行等级划分 }catch { }//返回一个数组double[] Classes = pClassify.ClassBreaks as double[];int ClassesCount = Classes.GetUpperBound(0);IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRenderer();pClassBreaksRenderer.Field = sFieldName; //设置分级字段pClassBreaksRenderer.BreakCount = ClassesCount; //设置分级数目pClassBreaksRenderer.SortClassesAscending = true;//分级后的图例是否按升级顺序排列//设置分级着色所需颜色带的起止颜色IHsvColor pFromColor = new HsvColor();pFromColor.Hue = 0;//黄色pFromColor.Saturation = 50;pFromColor.Value = 96;IHsvColor pToColor = new HsvColor();pToColor.Hue = 80;pToColor.Saturation = 100;pToColor.Value = 96;//产生颜色带对象IAlgorithmicColorRamp pAlgorithmicCR = new AlgorithmicColorRamp();pAlgorithmicCR.Algorithm = esriColorRampAlgorithm.esriHSVAlgorithm;pAlgorithmicCR.FromColor = pFromColor;pAlgorithmicCR.ToColor = pToColor;pAlgorithmicCR.Size = ClassesCount;pAlgorithmicCR.CreateRamp(out ok);//获得颜色IEnumColors pEnumColors = pAlgorithmicCR.Colors;//需要注意的是分级着色对象中的symbol和break的下标都是从0开始for (breakIndex = 0; breakIndex <= ClassesCount - 1; breakIndex++){IColor pColor = pEnumColors.Next();switch (pGeoFeatureL.FeatureClass.ShapeType){case esriGeometryType.esriGeometryPolygon:{ISimpleFillSymbol pSimpleFillS = new SimpleFillSymbol();pSimpleFillS.Color = pColor;pSimpleFillS.Style = esriSimpleFillStyle.esriSFSSolid;pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pSimpleFillS);//设置填充符号pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);//设定每一分级的分级断点break;}case esriGeometryType.esriGeometryPolyline:{ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbol();pSimpleLineSymbol.Color = pColor;pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pSimpleLineSymbol);pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);break;}case esriGeometryType.esriGeometryPoint:{ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbol();pSimpleMarkerSymbol.Color = pColor;pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pSimpleMarkerSymbol);//设置填充符号pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);//设定每一分级的分级断点break;}}}pGeoFeatureL.Renderer = (IFeatureRenderer)pClassBreaksRenderer;axMapControl1.Refresh();axTOCControl1.Update();}catch (Exception ex){MessageBox.Show("该字段不存在或无法渲染!");}
}