일반적으로 ArcMap에서 위와 같이 테이블 조인 후 레이어 내보내기를 하려면 아래와 같이 3 단계를 그치면 됩니다.
▣ ArcGIS for Desktop - ArcMap
1. Join Data
2. Export Data
3. Remove joins
▣ Custom Interface
위 3 단계를 다음과 같은 인터페이스를 만들어 조인 후 데이터 저장하는 기능을 한번에 제공할 수도 있습니다.
▣ C# Custom Code
레이어와 테이블간 조인 후 내보내기하는 코드는 아래와 같습니다. 아래 코드는 ESRI.ArcGIS.GeoDatabaseUI의 IExportOperation 인터페이스를 사용하므로 ArcGIS Desktop에서만 사용가능합니다.
- 주요 인터페이스
: IMemoryRelationshipClassFactory , IDisplayRelationshipClass, IExportOperation
using System; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.GeoDatabaseUI; using ESRI.ArcGIS.Carto; using GeoSpatial.ArcGIS.Core; namespace ArcGIS.Utility { class JoinExporter { public IFeatureClass ExportJoinLayer(IFeatureLayer featureLayer, String primaryKey, ITable joinTable, String foreignKey, esriRelCardinality relCardinality, IWorkspace outputWorkspace, String outputName) { IDisplayTable dispTable = (IDisplayTable)featureLayer; // opens the memory relationship class specified by the given properties. IMemoryRelationshipClassFactory mrClassFactory = new MemoryRelationshipClassFactoryClass(); IRelationshipClass relClass = mrClassFactory.Open(outputName, (IObjectClass)dispTable.DisplayTable, primaryKey, (IObjectClass)joinTable, foreignKey, "Forwards", "Backwards", relCardinality); // sets a join based on the specified relationship class and join type. IDisplayRelationshipClass distpRC = (IDisplayRelationshipClass)featureLayer; distpRC.DisplayRelationshipClass(relClass, esriJoinType.esriLeftOuterJoin); // prepare export IDataset inuptDataset = (IDataset)dispTable.DisplayTable; IDatasetName inputDatasetName = (IDatasetName)inuptDataset.FullName; // exports the given feature class to a new feature class. IExportOperation exportOperation = new ExportOperationClass(); // 1. defaults IDataset wsDataset = (IDataset)outputWorkspace; IFeatureClassName outputFClassName = new FeatureClassNameClass(); IDatasetName outputDatasetName = (IDatasetName)outputFClassName; outputDatasetName.Name = outputName; outputDatasetName.WorkspaceName = (IWorkspaceName)wsDataset.FullName; // 2. 위 그림의 Export Data 윈도우를 사용 // bool saveProjection; // esriExportTableOptions option; // outputDatasetName = exportOperation.GetOptions((IFeatureClass)dispTable.DisplayTable, srcFeatureLayer.Name, // false, true, 0, out saveProjection, out option); exportOperation.ExportFeatureClass(inputDatasetName, null, null, null, outputFClassName, 0); // finally removes the specified memory relationship class from a standalone table or layer. IRelationshipClassCollectionEdit relClassEdit = (IRelationshipClassCollectionEdit)featureLayer; relClassEdit.RemoveAllRelationshipClasses(); // open featureclass if (outputFClassName != null) { IName outputFcName = (IName)outputFClassName; return outputFcName.Open() as IFeatureClass; } return null; } } }