1、前言
前一篇博客介绍了如何在ArcEngine
中对点状要素进行符号化的方法,而在某些特殊的情况下,我们需要使用点状符号
对面状要素
进行符号化,也就是本篇要介绍的统计图表符号化。
2、数据准备
当前有一份面数据,其属性字段表如下图所示:
下面我们使用A
和B
这两个字段对该面要素进行统计图表符号化。
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;
}
}
}