ArcEngine 獲取字段唯一值


在做一般的數據處理時,要想得到某字段唯一值,我們可以利用SQL語言之關鍵字Distinct方便地獲得。但是在用AE作開發時,我們應該怎樣去做呢?當然我們可以首先獲得某個字段的所有值,然后再去比較、提取、獲得唯一值。這樣的工作寫起來麻煩,效率也非常低。其實AE類庫ESRI.ArcGIS.Geodatabase之接口IDataStatistics已為我們提供了這樣的方法。

ArcGIS開發幫助文檔有很多示例,大都都是用VB或是VBA編寫,下面是本人利用C#+AE9.1編寫的示例:

1        /// <summary>
 2        /// 得到要素類某字段的唯一值
 3        /// </summary>
 4        /// <param name="pFeatureClass">要素類</param>
 5        /// <param name="strFld">指定要得到唯一值的字段</param>
 6        /// <returns>唯一值字符數據</returns>
 7        public static string[] GetUniqueValue(IFeatureClass pFeatureClass,string strFld)
 8        {
 9            //得到IFeatureCursor游標
10            IFeatureCursor pCursor=pFeatureClass.Search(null,false);
11
12            //coClass對象實例生成
13            IDataStatistics pData=new DataStatisticsClass();
14            pData.Field=strFld;
15            pData.Cursor=pCursor as ICursor;
16
17            //枚舉唯一值
18            IEnumerator pEnumVar=pData.UniqueValues ;
19
20            //記錄總數
21            int RecordCount=pData.UniqueValueCount;
22
23            //字符數組
24            string[] strValue=new string[RecordCount];   
25            pEnumVar.Reset();
26        
27            int i=0;
28
29            while(pEnumVar.MoveNext())
30            {
31                strValue[++i]=pEnumVar.Current.ToString();
32            }            
33   
34            return strValue;
35        }

文章出處

  但當圖層的數據量很大時,以上這種方法執行起來速度較慢,性能影響比較明顯,得考慮使用另外一種方法。通過IQueryDef接口使用類似SQL的查詢語句來獲取圖層字段的唯一值集合,執行速度等同於執行SQL查詢語句。據說:在SDE.個人數據庫.可以的.在shape文件和 文件數據庫中不能使用.

Public Function GetUVByQueryDefFunction GetUVByQueryDefByVal pFeatureLayer As IFeatureLayer, ByVal strField As String As IListOf String
        Dim uvList As IListOf String = New ListOf String

        Dim pQueryDef As IQueryDef
        Dim pRow As IRow
        Dim pCursor As ICursor
        Dim pFeatureWorkspace As IFeatureWorkspace
        Dim pDataset As IDataset

        pDataset = pFeatureLayer.FeatureClass
        pFeatureWorkspace = pDataset.Workspace
        pQueryDef = pFeatureWorkspace.CreateQueryDef
        With pQueryDef
            .Tables = pDataset.Name ' Fully qualified table name
            .SubFields = 'DISTINCT' & strField & ''
            pCursor = .Evaluate
        End With

        pRow = pCursor.NextRow
        While Not pRow Is Nothing
            Dim pObj As Object = pRow.Value0
            uvList.AddpObj.ToString
            pRow = pCursor.NextRow
        End While
        Return uvList
    End Function

 文章出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM