핵심 코드는
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);