2010년 2월 6일 토요일

[Tips]GetFeature and GetFeatures

이 문서는 ArcGIS 9.3. 버전을 기준으로 작성되었으며, .NET C#(3.0) 샘플 코드 실행을 위해서는 다음의 어셈블리를 참조해야 한다.
- ESRI.ArcGIS.ADF
- ESRI.ArcGIS.Geodatabase
- ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)

이 문서는 Geodatabase API를 사용하는 개발자들에게 CheatSheet(커닝페이퍼?)을 제공할 목적으로 작성되었으며 주요 내용은 성능향상, 범하기 쉬운 실수 등을 제공한다.
예제 코드는 특정 상황에 대한 샘플 코드로서 패턴을 제공하고, 상황에 따라 오류를 비교하기 위해 임의의 오류를 포함하고 있으므로 이 코드를 재활용해서는 안된다.
 
⑦ GetFeature and GetFeatures
IFeatureClass 인터페이스는 Object ID를 이용하여 피쳐를 얻는데 2가지의 유사한 메쏘드(
GetFeature와 GetFeatures)를 제공한다.
 - GetFeature는 Integer 파라미터(Object ID)를 이용하여 단일 피쳐를 얻어온다.
 - GetFeatures는 Integer 배열 파라미터를 이용하여 커서를 생성하며, Recyling, Non-Recyling 파라미터를 포함한다.

성능향상을 위해, 알고있는 Object ID를 이용하여 하나 이상의 피쳐를 얻고자 할 경우 GetFeatures 메쏘드를 사용하는 것이 좋다. 아래 두 코드를 비교해 보자.

[code c#]
private static void GetFeatureExample(IFeatureClass featureClass, int[] oidList)
{
  int nameFieldIndex = featureClass.FindField("NAME");
  foreach (int oid in oidList)
  {
    IFeature feature = featureClass.GetFeature(oid);
    Console.WriteLine("NAME: {0}", feature.get_Value(nameFieldIndex));
  }
}

private static void GetFeaturesExample(IFeatureClass featureClass, int[] oidList)
{
  int nameFieldIndex = featureClass.FindField("FIPSSTCO");
  using(ComReleaser comReleaser = new ComReleaser())
  {
    IGeoDatabaseBridge geodatabaseBridge = new GeoDatabaseHelperClass();
    IFeatureCursor featureCursor = geodatabaseBridge.GetFeatures(featureClass,
      ref oidList, true);
    comReleaser.ManageLifetime(featureCursor);

    IFeature feature = null;
    while ((feature = featureCursor.NextFeature()) != null)
    {
      Console.WriteLine("NAME: {0}", feature.get_Value(nameFieldIndex));
    }
  }
}
[/code]
 위 코드처럼 단일 피쳐를 요청할 경우에는 같은 수준의 성능을 제공하지만, 적어도 2개 이상의 피쳐를 요청할 경우에 GetFeatures 메쏘드는 GetFeature 메쏘드에 비해 더 나은 성능을 제공(특히 Remote database의 경우에는)하며, 요청하는 피쳐 수가 더 늘어날수록 성능 차이는 더욱 커진다.

100개의 피쳐를 요청하는 경우에,
일반적으로 GetFeature 메쏘드는  GetFeatures 메쏘드보다 10 ~12배 이상이, 1000개의 피쳐의 경우에 20배 이상의 성능 차가 날 수 있다고 하니 잘 판단해서 사용하는 것이 좋다는 얘기다....
 

출처 : ArcGIS Resource Center

댓글 없음:

댓글 쓰기