C#AE对地图中的图层进行统计,结果以数据、表格、条形图的形式呈现
我自己做的一个窗体专门用来做统计:
(只需传入地图参数即可,所需其他静态函数在其他文章均有)
public class StatisticsAnalysis : Form
{
//地图
AxMapControl map;
public StatisticsAnalysis(AxMapControl mid)
{
InitializeComponent();
map = mid;
}
private void StatisticsAnalysis_Load(object sender, EventArgs e)
{
IList<ILayer> layers = EsriHelp.MapControlHelper.GetAllLayer(map);
foreach (ILayer layer in layers)
{
if (layer is IFeatureLayer)
{
LayerSConBox.Items.Add(layer.Name);
}
}
}
private void LayerSConBox_SelectedValueChanged(object sender, EventArgs e)
{
//清空上次添加
LayerFiedConBox.Items.Clear();
IFeatureLayer lfeatureayer = EsriHelp.MapControlHelper.GetLayerFromName(map, LayerSConBox.Text) as IFeatureLayer;
if (lfeatureayer != null)
{
//所选要素图层
IFeatureClass featureClass = lfeatureayer.FeatureClass;
for (int i = 0; i < featureClass.Fields.FieldCount; i++)
{
//整型字段添加
if (featureClass.Fields.Field[i].Type == esriFieldType.esriFieldTypeDouble || featureClass.Fields.Field[i].Type == esriFieldType.esriFieldTypeInteger || featureClass.Fields.Field[i].Type == esriFieldType.esriFieldTypeString)
{
LayerFiedConBox.Items.Add(featureClass.Fields.Field[i].Name);
}
}
}
}
private void LayerFiedConBox_SelectedValueChanged(object sender, EventArgs e)
{
//获取所选图层
IFeatureLayer lfeatureayer = EsriHelp.MapControlHelper.GetLayerFromName(map, LayerSConBox.Text) as IFeatureLayer;
if (lfeatureayer != null)
{
if (LayerFiedConBox.Items.Count != 0)
{
IFields fields = lfeatureayer.FeatureClass.Fields;
IField field = fields.Field[fields.FindField(LayerFiedConBox.Text)];
if (field.Type is esriFieldType.esriFieldTypeInteger || field.Type is esriFieldType.esriFieldTypeDouble)
{
//设置统计数据
ConductSatatistic(lfeatureayer.FeatureClass);
//设置图表
StatisticChart.Series.Clear();
StatisticChart.Titles.Clear();
ConductChart(lfeatureayer.FeatureClass);
}
else
{
ClearnConductSatatistic();
StatisticChart.Titles.Clear();
StatisticChart.Series.Clear();
//设置图表
ConductChart(lfeatureayer.FeatureClass);
}
}
}
}
/// <summary>
/// 获取统计结果
/// </summary>
/// <param name="featureClass"></param>
private void ConductSatatistic(IFeatureClass featureClass)
{
IDataStatistics dataStatistics = new DataStatisticsClass();
dataStatistics.Field = LayerFiedConBox.Text;
dataStatistics.Cursor = (ICursor)featureClass.Search(null, false);
#region//值统计
CountText.Text = dataStatistics.Statistics.Count.ToString();
MinText.Text = dataStatistics.Statistics.Minimum.ToString();
MaxText.Text = dataStatistics.Statistics.Maximum.ToString();
SumText.Text = dataStatistics.Statistics.Sum.ToString();
//保留两位小数
AverageText.Text = dataStatistics.Statistics.Mean.ToString("0.00");
//保留两位小数
StandardDevText.Text = dataStatistics.Statistics.StandardDeviation.ToString("0.00");
#endregion
}
/// <summary>
/// 清空图表信息
/// </summary>
private void ClearnConductSatatistic()
{
CountText.Text = "";
MinText.Text = "";
MaxText.Text = "";
SumText.Text = "";
AverageText.Text = "";
StandardDevText.Text = "";
}
/// <summary>
/// 设置图表
/// </summary>
/// <param name="featureClass"></param>
private void ConductChart(IFeatureClass featureClass)
{
IDataStatistics dataStatistics = new DataStatisticsClass();
#region//图表统计
dataStatistics.Field = LayerFiedConBox.Text;
dataStatistics.Cursor = (ICursor)featureClass.Search(null, false);
IEnumerator myEnumerator = dataStatistics.UniqueValues;
//获取该字段的唯一值字段
List<string> myValueList = new List<string>();
myEnumerator.Reset();
while (myEnumerator.MoveNext())
{
myValueList.Add(myEnumerator.Current.ToString());
}
//统计表格
DataTable dt = new DataTable();
if (featureClass.ShapeType is esriGeometryType.esriGeometryPolyline)
{
dt.Columns.Add("唯一值");
dt.Columns.Add("总长度");
}
if (featureClass.ShapeType is esriGeometryType.esriGeometryPolygon)
{
dt.Columns.Add("唯一值");
dt.Columns.Add("总面积");
}
if (featureClass.ShapeType is esriGeometryType.esriGeometryPoint)
{
dt.Columns.Add("唯一值");
dt.Columns.Add("总个数");
}
//创建图形标题
Series series = new Series(null, ViewType.Bar);
for (int i = 0; i < myValueList.Count; i++)
{
DataRow dr = dt.NewRow();
//统计字段数据
double data = 0;
int count = 0;
//设置查询条件
IQueryFilter queryFilter = new QueryFilterClass();
IFields fields = featureClass.Fields;
IField field = fields.Field[fields.FindField(LayerFiedConBox.Text)];
if (field.Type is esriFieldType.esriFieldTypeInteger || field.Type is esriFieldType.esriFieldTypeDouble)
{
queryFilter.WhereClause = LayerFiedConBox.Text + " = " + myValueList[i] ;
}
else
{
queryFilter.WhereClause = LayerFiedConBox.Text + " = '" + myValueList[i] + "'";
}
//游标
IFeatureCursor featureCursor =featureClass.Search(queryFilter,false);
IFeature feature = featureCursor.NextFeature();
while (feature != null)
{
//如果要素是线要素
if (feature.Shape.GeometryType is esriGeometryType.esriGeometryPolyline)
{
data += (feature.Shape as IPolyline).Length;
}
if (feature.Shape.GeometryType is esriGeometryType.esriGeometryPolygon)
{
data += (feature.Shape as IArea).Area;
}
count++;
feature= featureCursor.NextFeature();
}
//指针释放
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
#region//表格赋值
if (featureClass.ShapeType is esriGeometryType.esriGeometryPoint)
{
if (myValueList[i] == "")
{
dr[0] = "空";
}
else
{
dr[0] = myValueList[i];
}
dr[1] = count;
}
else
{
if (myValueList[i] == "")
{
dr[0] = "空";
}
else
{
dr[0] = myValueList[i];
}
dr[1] = ((int)data*100)/100;//保留两位小数
}
dt.Rows.Add(dr);
#endregion
SeriesPoint point;
//创建条型条形图
if (myValueList[i] == "")
{
point = new SeriesPoint("空", count);
}
else
{
point = new SeriesPoint(myValueList[i], count);
}
series.Points.Add(point);
series.ArgumentDataMember = myValueList[i];
series.ArgumentScaleType = ScaleType.Qualitative;
}
//图表赋值;
DataStatistic.DataSource = dt;
//更换数据源后填充列
DataStatistic.MainView.PopulateColumns();
//显示标注标签
series.LabelsVisibility = DefaultBoolean.True;
StatisticChart.Series.Add(series);
XYDiagram diagram = ((XYDiagram)StatisticChart.Diagram);
diagram.AxisX.Title.Text = "类型";
//设置X坐标轴显示全部类型标注
diagram.AxisX.QualitativeScaleOptions.AutoGrid = false;
diagram.AxisX.Label.ResolveOverlappingOptions.AllowHide = false;
diagram.AxisY.Title.Text = "频数";
//图标题
ChartTitle chartTitle = new ChartTitle();
chartTitle.Text = "频数分布";
chartTitle.TextColor = Color.Black;
StatisticChart.Titles.Add(chartTitle);
#endregion
}
}