基于C#的AE二次开发-地图渲染之分级设色符号化

28 篇文章 16 订阅
24 篇文章 44 订阅

基于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("该字段不存在或无法渲染!");
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值