2010년 1월 22일 금요일

[ArcObjects]Get Unique Values

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]