基于C#的AE二次开发-地图渲染之分级设色渲染符号化
我的开发环境为ArcGIS Engine 10.2与Visual studio2010。主地图名称为axMapControl1,Toc目录名为axTOCControl1,创建一个菜单或按钮,创建一个点击事件,粘贴代码修改图层与渲染字段即可实现。(注意相关事件的添加与动态链接库的引入)!
效果预览:
- 面状符号分级设色渲染
- 点状符号分级设色渲染
实现代码:
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("该字段不存在或无法渲染!");
}
}