2010년 11월 4일 목요일

[ArcObjects]Workspace의 모든 FeatureClass를 지도에 추가하기

다음은 ArcObjects에서 IWorkspace에 포함된 모든 레이어(일반적으로 IFeatureClass)를 지도에 추가하는 코드 샘플입니다. C#으로 작성되었으며, 개념만 확인하세요...

핵심 코드는
IEnumDataset  enumDataSet = srcWorkspace.get_Datasets(esriDatasetType.esriDTAny); 입니다.


▣ IFeatureClass로부터 IFeatureLayer를 생성하는 함수


private IFeatureLayer CreateFeatureLayer(IFeatureClass srcFc, string layerName, bool isVisible)
{
    IFeatureLayer featureLayer = new FeatureLayerClass();
    featureLayer.FeatureClass = srcFc;
    featureLayer.Visible = isVisible;

    if (string.IsNullOrEmpty(layerName))
    {
        featureLayer.Name = srcFc.AliasName;
    }
    else
    {
        featureLayer.Name = layerName;
    }

    return featureLayer;
}


▣ IWorkspace의 모든 FeatureClass를 IMap(지도)에 추가하기
여기에서 IWorkspace는 SDE Workspace뿐만 아니라 Shapefile, File GeoDatabase 등의 FeatureWorkspace를 모두 포함합니다.


private void AddAllFeatuerClassToMap(IMap srcMap, bool layerVisible, IWorkspace srcWorkspace)
{
    IFeatureLayer featureLayer = null;
    IFeatureClass featureClass = null;

    IEnumDataset enumDataSet = srcWorkspace.get_Datasets(esriDatasetType.esriDTAny);
    enumDataSet.Reset();
    IDataset dataSet = enumDataSet.Next();
    while (dataSet != null)
    {
        switch (dataSet.Type)
        {
            case esriDatasetType.esriDTFeatureClass:
                featureClass = (IFeatureClass)dataSet;

                // create feature layer
                featureLayer = CreateFeatureLayer(featureClass, featureClass.AliasName, layerVisible);

                // add layer to map
                srcMap.AddLayer(featureLayer);
                break;
            case esriDatasetType.esriDTFeatureDataset:
                IFeatureDataset featureDataset = (IFeatureDataset)dataSet;

                // create group layer
                IGroupLayer groupLayer = new GroupLayerClass();
                groupLayer.Name = featureDataset.Name;

                IEnumDataset enumSubSet = featureDataset.Subsets;
                enumSubSet.Reset();
                IDataset subDataSet = enumSubSet.Next();
                while (subDataSet != null)
                {
                    if (subDataSet.Type == esriDatasetType.esriDTFeatureClass)
                    {
                        featureClass = (IFeatureClass)subDataSet;

                        // create feature layer
                        featureLayer = CreateFeatureLayer(featureClass, featureClass.AliasName, layerVisible);

                        // add layer to group layer
                        groupLayer.Add(featureLayer);

                    }
                    subDataSet = enumSubSet.Next();
                }

                // add group layer to map
                srcMap.AddLayer(groupLayer);
                break;
        }
        dataSet = enumDataSet.Next();
    }
}

▣ 함수 사용하기
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;

private void AddLayers()
{
    IWorkspace srcWorkspace = OpenSdeWorkspace();

    IMap srcMap = GetMap();

    AddAllFeatuerClassToMap(srcMap, true, srcWorkspace);

   // refresh map
   IActiveView activeView = (IActiveView)srcMap;
   activeView.Refresh();
}

▣ 기타 참고하기
위 예제(불러와서 바로 지도에 추가하는 경우, 즉 FeatureClass를 직접 사용해야 하는 상황) 와는 달리 SDE Workspace나 기타 File GeoDatabase 등의 Feature Class가 많을 경우 Feature Class를 직접 사용하지 않고 모든 레이어 목록을 불러와야 하는 경우가 있습니다. 이럴때 아래 코드를 참고해 보세요. 속도 개선에 도움이 됩니다.

IEnumDatasetName enumDataSet = srcWorkspace.get_DatasetNames(esriDatasetType.esriDTAny);