在做一般的數據處理時,要想得到某字段唯一值,我們可以利用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