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
        }


    }

猜你喜欢

转载自blog.csdn.net/qq_38370387/article/details/89187405