ArcEngine中获取图层唯一值的方法
    
    这是在ArcEngine9.2中,获取图层指定字段唯一值的方法。鉴于ArcEngine众多的接口、函数,选择

合适的接口、方法来进行操作是很关键的,而且对它的学习也相对困难一些,需要一定的时间积累才能渡

过初期的困难时刻,这里与大家共勉,希望能早日成为AE高手。获取图层唯一值,一般通过

IDataStatistics和IQueryDef接口,IDataStatistics代码如下:

        /// <summary>
        /// 通过IDataStatistics获取图层指定字段唯一值
        /// </summary>
        /// <param name="pFeatureLayer"></param>
        /// <param name="fieldName"></param>
        /// <returns>指定字段所有唯一值</returns>
        private ArrayList GetLayerUniqueFieldValueByDataStatistics(IFeatureLayer

pFeatureLayer, string fieldName)
        {
            ArrayList arrValues = new ArrayList();
            IQueryFilter pQueryFilter = new QueryFilterClass();
            IFeatureCursor pFeatureCursor = null;

            pQueryFilter.SubFields = fieldName;
            pFeatureCursor = pFeatureLayer.FeatureClass.Search(pQueryFilter, true);

            IDataStatistics pDataStati = new DataStatisticsClass();
            pDataStati.Field = fieldName;
            pDataStati.Cursor = (ICursor)pFeatureCursor;

            IEnumerator pEnumerator = pDataStati.UniqueValues;
            pEnumerator.Reset();
            while (pEnumerator.MoveNext())
            {
                object pObj = pEnumerator.Current;
                arrValues.Add(pObj.ToString());
            }

            arrValues.Sort();
            return arrValues;
        }


      据网上资料介绍,当图层的数据量很大时,以上这种方法执行起来速度较慢,性能影响比较明显,

得考虑使用另外一种方法。通过IQueryDef接口使用类似SQL的查询语句来获取图层字段的唯一值集合,执

行速度等同于执行SQL查询语句。
        /// <summary>
        /// 通过IQueryDef获取图层指定字段唯一值
        /// </summary>
        /// <param name="pFeatureLayer"></param>
        /// <param name="fieldName"></param>
        /// <returns>指定字段所有唯一值</returns>
        private ArrayList GetLayerUniqueFieldValueByQueryDef(IFeatureLayer pFeatureLayer,

string fieldName)
        {
            ArrayList arrValues = new ArrayList();

            IQueryDef pQueryDef = null;
            IRow pRow = null;
            ICursor pCursor = null;
            IFeatureWorkspace pFeatWrok = null;
            IDataset pDataset = null;

            pDataset = (IDataset)pFeatureLayer.FeatureClass;
            pFeatWrok = (IFeatureWorkspace)pDataset.Workspace;
            pQueryDef = pFeatWrok.CreateQueryDef();
            pQueryDef.Tables = pDataset.Name;
            pQueryDef.SubFields = "DISTINCT(" + fieldName + ")";
            pCursor = pQueryDef.Evaluate();

            pRow = pCursor.NextRow();
            while (pRow != null)
            {
                object pObj = pRow.get_Value(0);
                arrValues.Add(pObj.ToString());

                pRow = pCursor.NextRow();
            }

            arrValues.Sort();
            return arrValues;
        }
      经过的我的实际测试,在C#中,用IQueryDef方法没有成功,运行到这句pCursor =

pQueryDef.Evaluate();就出错了,并没有得到结果集,估计是workspace的原因,查看ArcEngine的帮助

例子,确定应该是这个原因。因此后面的这个函数,在使用时需要注意,在同一个workspace下进行。
posted on 2008-05-24 18:57  叶秋  阅读(1635)  评论(0编辑  收藏  举报