基于C#的AE二次开发-地图渲染之唯一值符号化

本文详细介绍使用C#与ArcGISEngine进行地图二次开发,实现地图唯一值符号化渲染的过程。通过具体代码示例,展示了如何根据字段值创建随机颜色渲染方案,适用于面、线、点等不同类型的地理要素。

基于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("该字段不存在!");
    }
}

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

<think>好的,我现在需要帮助用户解决在C#中使用ArcGIS Engine进行二次开发绘制点、线、面的问题。首先,我得回忆一下用户提供的引用内容,特别是引用[2],里面提到了axMapControl1_OnMouseDown事件和MarkerElementClass的使用。用户可能已经看过一些基础教程,但需要具体的示例步骤。 首先,我得确定绘制点、线、面的基本流程。通常,这包括设置绘制模式、处理鼠标事件、创建几何对象,并将其添加到地图控件中。根据引用[2],用户需要处理鼠标点击事件来获取坐标,然后创建几何元素,比如MarkerElementClass用于点。 接下来,我需要分步骤说明如何实现每个几何图形的绘制。对于点要素,可能需要在点击时记录坐标并创建点元素。对于线,可能需要收集多个点,然后在鼠标移动或双击时完成线的绘制。面要素类似线,但需要闭合路径。 还需要考虑使用ArcGIS Engine的接口,比如IGeometry、IPoint、IPolyline、IPolygon,以及元素类如MarkerElement、LineElement、PolygonElement。此外,地图控件的刷新和元素添加的方法也是关键,比如使用IGraphicsContainer来管理图形元素。 用户可能遇到的问题包括坐标转换、元素样式的设置,以及事件处理的正确绑定。例如,在绘制线或面时,如何将多个点连接起来,并确保几何对象的正确创建。此外,引用[2]中提到了axMapControl1_OnMouseDown事件,可能需要结合其他事件如OnMouseMove或OnDoubleClick来完成绘制过程。 另外,代码示例需要准确,确保语法正确,比如正确转换PointClass到IGeometry接口,以及使用GraphicsContainer来添加元素。可能还需要设置符号样式,如使用SimpleMarkerSymbol或SimpleLineSymbol来定义点的颜色和大小,线的样式等。 最后,要生成相关问题,帮助用户深入理解,比如如何设置不同的符号样式,如何处理多个几何图形,或者如何进行坐标系统的转换。这些问题能引导用户进一步探索ArcGIS Engine的功能。</think>在C#中使用ArcGIS Engine进行二次开发绘制点线面,需结合地图控件事件与几何对象操作。以下是关键步骤和代码示例: ### 一、环境配置与基础设置 1. 引用ESRI.ArcGIS.Carto、ESRI.ArcGIS.Display等核心库 2. 初始化MapControl控件并加载地图文档 ### 二、点要素绘制 ```csharp private void btnDrawPoint_Click(object sender, EventArgs e) { // 创建点符号 ISimpleMarkerSymbol markerSymbol = new SimpleMarkerSymbolClass(); markerSymbol.Color = new RgbColorClass { Red = 255, Green = 0, Blue = 0 }; markerSymbol.Size = 8; // 添加元素到地图 IGraphicsContainer graphicsContainer = axMapControl1.Map as IGraphicsContainer; IElement element = new MarkerElementClass(); element.Geometry = new PointClass { X = 100, Y = 30 }; element.Symbol = markerSymbol as ISymbol; graphicsContainer.AddElement(element, 0); axMapControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null); } ``` ### 三、线要素绘制 ```csharp private IPointCollection linePoints = new PolylineClass(); private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) { if (isDrawingLine) { linePoints.AddPoint(new PointClass { X = e.mapX, Y = e.mapY }); if (linePoints.PointCount > 1) { // 创建线符号 ISimpleLineSymbol lineSymbol = new SimpleLineSymbolClass(); lineSymbol.Width = 2; IElement lineElement = new LineElementClass(); lineElement.Geometry = linePoints as IGeometry; lineElement.Symbol = lineSymbol; (axMapControl1.Map as IGraphicsContainer).AddElement(lineElement, 0); axMapControl1.Refresh(); } } } ``` ### 四、面要素绘制 ```csharp private IPointCollection polygonPoints = new PolygonClass(); private void axMapControl1_OnDoubleClick(object sender, IMapControlEvents2_OnDoubleClickEvent e) { if (isDrawingPolygon) { polygonPoints.AddPoint(new PointClass { X = e.mapX, Y = e.mapY }); if (polygonPoints.PointCount >= 3) { // 闭合多边形 ITopologicalOperator topo = polygonPoints as ITopologicalOperator; topo.Simplify(); // 创建面符号 ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass(); fillSymbol.Color = new RgbColorClass { Red = 0, Green = 255, Blue = 255 }; IElement polyElement = new PolygonElementClass(); polyElement.Geometry = polygonPoints as IGeometry; polyElement.Symbol = fillSymbol; (axMapControl1.Map as IGraphicsContainer).AddElement(polyElement, 0); axMapControl1.Refresh(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值