基于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";
        
        IGeoFeatureLayer pGeoFeatLyr = pFeatLyr as IGeoFeatureLayer;
        ITable pTable = pFeatLyr as ITable;
        IUniqueValueRenderer pUniqueValueRender = new UniqueValueRenderer();

        int intFieldNumber = pTable.FindField(sFieldName);
        pUniqueValueRender.FieldCount = 1;//设置唯一值符号化的关键字段为一个
        pUniqueValueRender.set_Field(0, sFieldName);//设置唯一值符号化的第一个关键字段
		
        IRandomColorRamp pRandColorRamp = new RandomColorRamp();
        pRandColorRamp.StartHue = 0;
        pRandColorRamp.MinValue = 0;
        pRandColorRamp.MinSaturation = 15;
        pRandColorRamp.EndHue = 360;
        pRandColorRamp.MaxValue = 100;
        pRandColorRamp.MaxSaturation = 30;
        //根据渲染字段的值的个数,设置一组随机颜色,如某一字段有5个值,则创建5个随机颜色与之匹配
        IQueryFilter pQueryFilter = new QueryFilter();
        pRandColorRamp.Size = pFeatLyr.FeatureClass.FeatureCount(pQueryFilter);
        bool bSuccess = false;
        pRandColorRamp.CreateRamp(out bSuccess);

        IEnumColors pEnumRamp = pRandColorRamp.Colors;
        IColor pNextUniqueColor = null;
        //查询字段的值
        pQueryFilter = new QueryFilter();
        pQueryFilter.AddField(sFieldName);
        ICursor pCursor = pTable.Search(pQueryFilter, true);
        IRow pNextRow = pCursor.NextRow();
        object codeValue = null;
        IRowBuffer pNextRowBuffer = null;

        //遍历要素类中的所有要素
        while (pNextRow != null)
        {
            pNextRowBuffer = pNextRow as IRowBuffer;
            //获取渲染字段的每一个值
            codeValue = pNextRowBuffer.get_Value(intFieldNumber);

            pNextUniqueColor = pEnumRamp.Next();
            if (pNextUniqueColor == null)
            {
                pEnumRamp.Reset();
                pNextUniqueColor = pEnumRamp.Next();
            }
            IFillSymbol pFillSymbol = null;
            ILineSymbol pLineSymbol;
            IMarkerSymbol pMarkerSymbol;
            switch (pGeoFeatLyr.FeatureClass.ShapeType)
            {
                //如何该要素类 类型为面状要素,就创建面状填充符号
                case esriGeometryType.esriGeometryPolygon:
                    {
                        pFillSymbol = new SimpleFillSymbol();
                        pFillSymbol.Color = pNextUniqueColor;
                        pUniqueValueRender.AddValue(codeValue.ToString(), "", pFillSymbol as ISymbol);//添加渲染字段的值和渲染样式
                        pNextRow = pCursor.NextRow();
                        break;
                    }
                //如何该要素类 类型为线状要素,就创建简单线符号
                case esriGeometryType.esriGeometryPolyline:
                    {
                        pLineSymbol = new SimpleLineSymbol();
                        pLineSymbol.Color = pNextUniqueColor;
                        pUniqueValueRender.AddValue(codeValue.ToString(), "", pLineSymbol as ISymbol);//添加渲染字段的值和渲染样式
                        pNextRow = pCursor.NextRow();
                        break;
                    }
                //如何该要素类 类型为点状要素,就创建简单标记符号
                case esriGeometryType.esriGeometryPoint:
                    {
                        pMarkerSymbol = new SimpleMarkerSymbol();
                        pMarkerSymbol.Color = pNextUniqueColor;
                        pUniqueValueRender.AddValue(codeValue.ToString(), "", pMarkerSymbol as ISymbol);//添加渲染字段的值和渲染样式
                        pNextRow = pCursor.NextRow();
                        break;
                    }
            }
        }
        //渲染并刷新地图窗口与目录栏窗口
        pGeoFeatLyr.Renderer = pUniqueValueRender as IFeatureRenderer;
        axMapControl1.Refresh();
        axTOCControl1.Update();
    }
    catch (Exception ex) {
        MessageBox.Show("该字段不存在!");
    }
}

感兴趣的小伙伴快去试试吧~

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值