ArcEngine接口之IDataStatistics ,获取统计值(唯一值、最值......)

在做一般的数据处理时,要想得到某字段唯一值,我们可以利用SQL语言之关键字Distinct方便地获得。但是在用AE作开发时,我们应该怎样去做呢?当然我们可以首先获得某个字段的所有值,然后再去比较、提取、获得唯一值。这样的工作写起来麻烦,效率也非常低。其实AE类库ESRI.ArcGIS.Geodatabase之接口IDataStatistics已为我们提供了这样的方法。

image

概述
      一般常用的统计功能例如:唯一字段统计、数据行数统计、数据值求和统计等。
     1、基础统计(BaseStatistics)组件用来生成和报告统计结果。
     2、IFrequencyStatistics接口提供对用来报告频率统计的成员的访 问。
     3、IGenerateStatistics接口提供对用来生成统计结果的成员的访问。
     4、IStatisticsResults提供对用来报告统计结果的成员的访问。
     可访问的属性有Count,Sum,Maximum,Minimum,Meanm,StandardDeviation(标准差)
      DataStatistics组件允许返回统计结果及单个字段的唯一值。组件创建后,用来分析的数据通过IDataStatistics::Cursor属性,以光标形式的传入。注意ICursor的对象只能使用一次,如果要获取多个结果,应当再次创建光标。IDataStatistics是数据统计组件中唯一的接口

1、IDataStatistics
属性
Cursor--通过游标来生成统计表
Field--要统计的字段
UniqueValueCount--统计表中唯一值总数
UniqueValues--唯一值枚举
Statistics-- IStatisticsResults对象,用于返回统计信息

2、IStatisticsResults
属性
Count--值总数
Maximum --最大值
Mean--算术平均值
Minimum--最小值
StandardDeviation--标准差
Sum--求和

 

获取唯一值和其他统计值

/// <summary>
        /// 获取目标图层
        /// </summary>
        /// <param name="FCName">图层要素名称</param>
        /// <returns></returns>
        private IFeatureLayer GetFeatureLayer(string fcName)
        {
            ILayer pLayer = null;
            for (int i = 0; i < m_mapControl.LayerCount; i++)
            {
                IDataset pDataset = ((IFeatureLayer)m_mapControl.get_Layer(i)).FeatureClass as IDataset;
                string pDatasetName = pDataset.Name;
                int index = pDatasetName.LastIndexOf(".");
                if (index != -1)
                    pDatasetName = pDatasetName.Substring(index + 1);
                if (pDatasetName == fcName)
                {
                    pLayer = m_mapControl.get_Layer(i);
                    break;
                }
            }
            return pLayer as IFeatureLayer;
        }


        /// <summary>
        /// 获取唯一值和其他统计值
        /// </summary>
        /// <param name="fcName">图层名</param>
        /// <param name="filed">字段</param>
        public void IDataStatistics_Example(string fcName, string filed)
        {
            //获取选中的图层
            IFeatureLayer pFeatureLayer = GetFeatureLayer(fcName);
            if (pFeatureLayer == null) return;
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
            ICursor pCursor;
            pSelectionSet.Search(null, true, out pCursor);
            int s = pSelectionSet.Count;


            IDataStatistics pDataStatistics = new DataStatisticsClass();
            //获取唯一值
            List<string> listValues = new List<string>();
            pDataStatistics.Field = filed;//统计字段
            pDataStatistics.Cursor = pCursor;
            IEnumerator myEnumerator = pDataStatistics.UniqueValues;
            myEnumerator.Reset();
            while (myEnumerator.MoveNext())
            {
                listValues.Add(myEnumerator.Current.ToString());
            }


            //获取其他统计值
            pSelectionSet.Search(null, true, out pCursor);
            pDataStatistics.Cursor = pCursor;
            pDataStatistics.Field = filed;//统计字段
            //IDataStatistics的属性Statistics返回一个IStatisticsResult的对象
            ESRI.ArcGIS.esriSystem.IStatisticsResults pStatisticsResults = pDataStatistics.Statistics;
            //统计字段信息
            int count = pStatisticsResults.Count;//个数
            double mj = pStatisticsResults.Mean;//平均值

        }

但当图层的数据量很大时,以上这种方法执行起来速度较慢,性能影响比较明显,得考虑使用另外一种方法。通过IQueryDef接口使用类似SQL的查询语句来获取图层字段的唯一值集合,执行速度等同于执行SQL查询语句。据说:在SDE.个人数据库.可以的.在shape文件和 文件数据库中不能使用.

关于查询与统计接口,还有IQueryDef、IQueryFilterDefinition、ITable等。例子如下:

//IQueryDef Example
        public void IQueryDef_Example(IWorkspace workspace)
        {
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
            //create query definition
            IQueryDef queryDef = featureWorkspace.CreateQueryDef();
            //provide list of tables to join
            queryDef.Tables = "datesjoin,dudatest";
            //retrieve the fields from all tables
            queryDef.SubFields = "sde.datesjoin.dt_field = sde.dudates.dt_field";
            //set up join
            queryDef.WhereClause = "datesjoin.dt_field = dudates.dt_field";

            //Create FeatureDataset. Note the use of .OpenFeatureQuery.
            //The name "MyJoin" is the name of the restult of the query def and
            //is used in place of a feature class name.
            IFeatureDataset featureDataset = featureWorkspace.OpenFeatureQuery("MyJoin", queryDef);
            //open layer to test against
            IFeatureClassContainer featureClassContainer = (IFeatureClassContainer)featureDataset;
            IFeatureClass featureClass = featureClassContainer.get_ClassByName("MyJoin");

        }

        //IQueryFilterDefinition PostfixClause Example
        public void IQueryFilterDefinition_PostfixClause_Example(IFeatureClass featureClass)
        {
            //this function uses the PostfixClause property to append an Order By clause to the query.
            IQueryFilter queryFilter = new QueryFilterClass();
            queryFilter.SubFields = "FULLNAME";
            queryFilter.WhereClause = "OBJECTID > 10";
            IQueryFilterDefinition queryFilterDefinition = (IQueryFilterDefinition)queryFilter;
            queryFilterDefinition.PostfixClause = "ORDER BY FULLNAME";
            IFeatureCursor featureCursor = featureClass.Search(queryFilter, true);
            int fieldIndex = featureCursor.FindField("FULLNAME");
            IFeature feature = featureCursor.NextFeature();
            while (feature != null)
            {
                Console.WriteLine("The value of the {0} field is {1)", featureCursor.Fields.get_Field(fieldIndex).Name, feature.get_Value(fieldIndex));
                feature = featureCursor.NextFeature();
            }
        }

        //ITable Example
        public void ITable_Example(IFeatureClass featureClass)
        {
            ITable pTable = featureClass as ITable;
            Console.WriteLine("The Row Count is:{0}", pTable.RowCount.Tostring());
        }
posted @ 2018-12-21 17:16  ParanoiaApe  阅读(1895)  评论(0)    收藏  举报