Unique Value 렌더러(IUniqueValueRenderer)를 생성하기 위해서는 Unique Values를 얻어와야 합니다.
다음 예제는 ArcObjects의 IDataStatistics 인터페이스 및 ICursor 인터페이스를 활용하여 Unique Value를 얻어오는 일반적인 코드입니다.
IDataStatistics 의 Statistics 속성은 IStatisticsResults로서 Count, Minimum, Maximum, Mean, Sum, Standard Deviation 값을 가져올 수 있습니다.
사실 이 방법 외에도 Unique Value를 얻는 방법은 많습니다. 데이터의 크기나 응용프로그램의 특성에 따라 최적의 방법을 찾으면 되겠지요...
※ Understanding Cursors in ArcObjects
① IDataStatistics의 UniqueValues 속성을 이용하여 얻기
[code c#]
public static System.Collections.IEnumerator GetUniqueValues(ITable ipTable, IQueryFilter ipFilter, string fieldName, bool useSorting)
{
ICursor ipCursor = null;
if (useSorting)
{
//앞 글에서 Sorted Cursor 얻기 참고
ipCursor = GetSortedCursor(ipTable, ipFilter, new string[] { fieldName }, true);
}
else
{
ipCursor = ipTable.Search(ipFilter, true);
}
IDataStatistics ipDataStat = new DataStatisticsClass();
ipDataStat.Field = fieldName;
ipDataStat.Cursor = ipCursor;
System.Collections.IEnumerator ipEnum = ipDataStat.UniqueValues;
System.Runtime.InteropServices.Marshal.ReleaseComObject(ipCursor);
return ipEnum;
}
[/code]
② ICursor를 이용하여 Unique Values 얻기
[code c#]
public static System.Collections.Generic.List<object> GetUniqueValuesList(ITable ipTable, IQueryFilter ipFilter, string fieldName, bool useSorting)
{
System.Collections.Generic.List<object> uvList = new System.Collections.Generic.List<object>();
int idxField = ipTable.FindField(fieldName);
if (idxField == -1) return uvList;
ICursor ipCursor = ipTable.Search(ipFilter, true);
IRow ipRow = ipCursor.NextRow();
while (ipRow != null)
{
object curValue = ipRow.get_Value(idxField);
if (! uvList.Contains(curValue))
{
uvList.Add(curValue);
}
ipRow = ipCursor.NextRow();
}
if (useSorting)
{
uvList.Sort();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(ipCursor);
return uvList;
}
[/code]
③ 활용 예
[code c#]
IWorkspace ipSourcewS = OpenShapefileWs("폴더경로");
IFeatureClass ipInputFc = OpenFeatureClass(ipSourcewS, "클래스이름");
System.Collections.Generic.List<object> uvList = null;
uvList = GetUniqueValuesList((ITable)ipInputFc, null, "필드명", true);
foreach (string uvValue in uvList)
{
System.Diagnostics.Debug.WriteLine(uvValue);
}
System.Collections.IEnumerator ipEnum = GetUniqueValues((ITable)ipInputFc, null, "필드명", true);
ipEnum.Reset();
while (ipEnum.MoveNext())
{
System.Diagnostics.Debug.WriteLine(ipEnum.Current.ToString());
}
[/code]
댓글 없음:
댓글 쓰기