有时我们需要读取图层中某个字段的所有值的唯一值集合,或做统计用途,或作为其他功能的输入。
'
'' <summary>
'
'' 通过IDataStatistic接口获取图层指定字段的唯一值
'
'' </summary>
'
'' <param name="pFeatureLayer">目标图层</param>
'
'' <param name="strField">目标字段名</param>
'
'' <returns>目标字段的所有值的唯一值集合</returns>
'
'' <remarks></remarks>

Public
Function GetUVByDataStatistics()
Function GetUVByDataStatistics(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
Dim uvList As IList(Of String) = New List(Of String)

Dim pQueryFilter As IQueryFilter = New QueryFilter
Dim pFeatureCur As IFeatureCursor
pQueryFilter.SubFields = strField
pFeatureCur = pFeatureLayer.FeatureClass.Search(pQueryFilter, True)

Dim pDataStatic As IDataStatistics = New DataStatistics
pDataStatic.Field = strField
pDataStatic.Cursor = pFeatureCur
Dim pEnumvar As System.Collections.IEnumerator = pDataStatic.UniqueValues
pEnumvar.Reset()
While pEnumvar.MoveNext
Dim pObj As Object = pEnumvar.Current
uvList.Add(pObj.ToString)
End While
Return uvList
End Function
'
'' <summary>
'
'' 通过IQueryDef接口查询字段的唯一值
'
'' </summary>
'
'' <param name="pFeatureLayer">目标图层</param>
'
'' <param name="strField">目标字段名</param>
'
'' <returns>目标字段的所有值的唯一值集合</returns>
'
'' <remarks></remarks>

Public
Function GetUVByQueryDef()
Function GetUVByQueryDef(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
Dim uvList As IList(Of String) = New List(Of 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.Value(0)
uvList.Add(pObj.ToString)
pRow = pCursor.NextRow
End While
Return uvList
End Function
一般通过IDataStatistics接口来获取唯一值集合,代码如下:



























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

































