ArcEngine符号化——统计图表符号

1、前言

前一篇博客介绍了如何在ArcEngine中对点状要素进行符号化的方法,而在某些特殊的情况下,我们需要使用点状符号面状要素进行符号化,也就是本篇要介绍的统计图表符号化。

2、数据准备

当前有一份面数据,其属性字段表如下图所示:
在这里插入图片描述
下面我们使用AB这两个字段对该面要素进行统计图表符号化。

3、统计图表符号

3.1、柱状图符号
在这里插入图片描述
3.2、饼状图符号
在这里插入图片描述

3.3、堆积图符号
在这里插入图片描述

4、实现代码

using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using stdole;
using ESRI.ArcGIS.Geodatabase;

namespace Win
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            axMapControl1.AddShapeFile(@"C:\Users\DSF\Desktop\data", @"polygon.shp");
        }

        /// <summary>
        /// 柱状图符号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBarChartSymbol_Click(object sender, EventArgs e)
        {
            IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            // 统计字段A
            IDataStatistics pDataStatistics_1 = new DataStatistics();
            pDataStatistics_1.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_1.Field = "A";

            // 统计字段B
            IDataStatistics pDataStatistics_2 = new DataStatistics();
            pDataStatistics_2.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_2.Field = "B";

            // 获取最大值
            double a = pDataStatistics_1.Statistics.Maximum;
            double b = pDataStatistics_2.Statistics.Maximum;
            double c = a > b ? a : b;

            // 设置柱状图样式
            IBarChartSymbol pBarChartSymbol = new BarChartSymbol() as IBarChartSymbol;
            pBarChartSymbol.Width = 10;

            // 设置最大值
            IChartSymbol pChartSymbol = pBarChartSymbol as IChartSymbol;
            pChartSymbol.MaxValue = c;

            // 设置符号尺寸
            IMarkerSymbol pMarkerSymbol = pBarChartSymbol as IMarkerSymbol;
            pMarkerSymbol.Size = 30;

            // 字段A的符号
            ISymbolArray pSymbolArray = pBarChartSymbol as ISymbolArray;
            IFillSymbol pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(255, 0, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 字段B的符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 255, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 面要素填充符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 0, 255);

            // 创建渲染对象
            IChartRenderer pChartRenderer = new ChartRenderer();

            // 添加字段
            IRendererFields pRendererFields = pChartRenderer as IRendererFields;
            pRendererFields.AddField("A", "A");
            pRendererFields.AddField("B", "B");

            // 设置渲染属性
            pChartRenderer.ChartSymbol = pChartSymbol as IChartSymbol;
            pChartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            pChartRenderer.UseOverposter = false;
            pChartRenderer.CreateLegend();

            // 刷新地图
            IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
            pGeoFeatureLayer.Renderer = pChartRenderer as IFeatureRenderer;
            axMapControl1.Refresh();
            axTOCControl1.Update();
        }

        /// <summary>
        /// 饼状图符号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPieChartSymbol_Click(object sender, EventArgs e)
        {
            IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            // 统计字段A
            IDataStatistics pDataStatistics_1 = new DataStatistics();
            pDataStatistics_1.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_1.Field = "A";

            // 统计字段B
            IDataStatistics pDataStatistics_2 = new DataStatistics();
            pDataStatistics_2.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_2.Field = "B";

            // 获取极值
            double a = pDataStatistics_1.Statistics.Maximum;
            double b = pDataStatistics_2.Statistics.Maximum;
            double c = pDataStatistics_1.Statistics.Minimum;
            double d = pDataStatistics_2.Statistics.Minimum;
            double max = a > b ? a : b;
            double min = c < d ? c : d;

            // 设置饼图样式
            IPieChartSymbol pPieChartSymbol = new PieChartSymbol() as IPieChartSymbol;
            pPieChartSymbol.Clockwise = true;
            pPieChartSymbol.UseOutline = true;

            // 设置最大值
            IChartSymbol pChartSymbol = pPieChartSymbol as IChartSymbol;
            pChartSymbol.MaxValue = max;

            // 设置符号尺寸
            IMarkerSymbol pMarkerSymbol = pPieChartSymbol as IMarkerSymbol;
            pMarkerSymbol.Size = 30;

            // 字段A的符号
            ISymbolArray pSymbolArray = pPieChartSymbol as ISymbolArray;
            IFillSymbol pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(255, 0, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 字段B的符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 255, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 面要素填充符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 0, 255);

            // 创建图表渲染对象
            IChartRenderer pChartRenderer = new ChartRenderer();

            // 创建饼图渲染对象
            IPieChartRenderer pPieChartRenderer = pChartRenderer as IPieChartRenderer;
            pPieChartRenderer.MinSize = 20;
            pPieChartRenderer.MinValue = min;
            pPieChartRenderer.FlanneryCompensation = false;
            pPieChartRenderer.ProportionalBySum = false;

            // 添加字段
            IRendererFields pRendererFields = pChartRenderer as IRendererFields;
            pRendererFields.AddField("A", "A");
            pRendererFields.AddField("B", "B");

            // 设置渲染属性
            pChartRenderer.ChartSymbol = pChartSymbol as IChartSymbol;
            pChartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            pChartRenderer.UseOverposter = false;
            pChartRenderer.CreateLegend();

            // 刷新地图
            IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
            pGeoFeatureLayer.Renderer = pChartRenderer as IFeatureRenderer;
            axMapControl1.Refresh();
            axTOCControl1.Update();
        }

        /// <summary>
        /// 堆积图符号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStackedChartSymbol_Click(object sender, EventArgs e)
        {
            IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            // 统计字段A
            IDataStatistics pDataStatistics_1 = new DataStatistics();
            pDataStatistics_1.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_1.Field = "A";

            // 统计字段B
            IDataStatistics pDataStatistics_2 = new DataStatistics();
            pDataStatistics_2.Cursor = pFeatureClass.Search(null, true) as ICursor;
            pDataStatistics_2.Field = "B";

            // 获取极值
            double a = pDataStatistics_1.Statistics.Maximum;
            double b = pDataStatistics_2.Statistics.Maximum;
            double c = a > b ? a : b;

            // 创建堆积图符号
            IStackedChartSymbol pStackedChartSymbol = new StackedChartSymbol() as IStackedChartSymbol;
            pStackedChartSymbol.Width = 10;

            // 设置最大值
            IChartSymbol pChartSymbol = pStackedChartSymbol as IChartSymbol;
            pChartSymbol.MaxValue = c;

            // 设置符号尺寸
            IMarkerSymbol pMarkerSymbol = pStackedChartSymbol as IMarkerSymbol;
            pMarkerSymbol.Size = 30;

            // 字段A的符号
            ISymbolArray pSymbolArray = pStackedChartSymbol as ISymbolArray;
            IFillSymbol pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(255, 0, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 字段B的符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 255, 0);
            pSymbolArray.AddSymbol(pFillSymbol as ISymbol);

            // 面要素填充符号
            pFillSymbol = new SimpleFillSymbol();
            pFillSymbol.Color = CreateRgbColor(0, 0, 255);

            // 创建图表渲染对象
            IChartRenderer pChartRenderer = new ChartRenderer();

            // 添加字段
            IRendererFields pRendererFields = pChartRenderer as IRendererFields;
            pRendererFields.AddField("A", "A");
            pRendererFields.AddField("B", "B");

            // 设置渲染属性
            pChartRenderer.ChartSymbol = pChartSymbol as IChartSymbol;
            pChartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            pChartRenderer.UseOverposter = false;
            pChartRenderer.CreateLegend();

            // 刷新地图
            IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
            pGeoFeatureLayer.Renderer = pChartRenderer as IFeatureRenderer;
            axMapControl1.Refresh();
            axTOCControl1.Update();
        }

        /// <summary>
        /// 创建RGB颜色
        /// </summary>
        /// <param name="R"></param>
        /// <param name="G"></param>
        /// <param name="B"></param>
        /// <returns></returns>
        private IRgbColor CreateRgbColor(int R, int G, int B)
        {
            IRgbColor pRgbColor = new RgbColor();
            pRgbColor.Red = R;
            pRgbColor.Green = G;
            pRgbColor.Blue = B;
            return pRgbColor;
        }
    }
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对选中点要素进行符号化,可以使用ArcEngine中的以下步骤: 1. 获取选中的要素集合: 首先,使用ISelectionEnvironment接口获取当前的选择环境。然后,使用ISelectionSet接口获取选中的要素集合。 2. 创建要素渲染器: 使用IFeatureRenderer接口创建一个新的要素渲染器对象(如SimpleRenderer、UniqueValueRenderer等)。 3. 设置要素符号: 根据需求,为要素渲染器设置相应的要素符号。可以使用ISymbol接口创建点符号(如SimpleMarkerSymbol、PictureMarkerSymbol等)。 4. 应用符号化: 使用IFeatureLayer接口获取要素图层对象。然后,将刚刚创建的要素渲染器赋值给图层的Renderer属性。最后,调用IActiveView接口的PartialRefresh方法刷新地图视图。 下面是一个示例代码片段,演示了如何对选中点要素进行符号化: ```csharp // 获取当前选择环境 ISelectionEnvironment selectionEnvironment = new SelectionEnvironmentClass(); ISelectionSet selectionSet = selectionEnvironment.Catalog.SelectionSet; // 创建要素渲染器 ISimpleRenderer simpleRenderer = new SimpleRendererClass(); ISymbol symbol = new SimpleMarkerSymbolClass(); simpleRenderer.Symbol = symbol; // 设置要素符号 // ... // 应用符号化 IFeatureLayer featureLayer = (IFeatureLayer)mapLayer; featureLayer.Renderer = (IFeatureRenderer)simpleRenderer; IActiveView activeView = (IActiveView)mapControl.Map; activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); ``` 请根据实际需求,根据ArcEngine的API文档进一步调整和完善代码。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值