ArcEngine接口之IDataStatistics ,获取统计值(唯一值、最值......)
在做一般的数据处理时,要想得到某字段唯一值,我们可以利用SQL语言之关键字Distinct方便地获得。但是在用AE作开发时,我们应该怎样去做呢?当然我们可以首先获得某个字段的所有值,然后再去比较、提取、获得唯一值。这样的工作写起来麻烦,效率也非常低。其实AE类库ESRI.ArcGIS.Geodatabase之接口IDataStatistics已为我们提供了这样的方法。
概述 1、IDataStatistics 2、IStatisticsResults |
获取唯一值和其他统计值
/// <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()); }