2011년 8월 22일 월요일

[ArcObjects] Join Data & Export Layer Code Snippet

레이어와 속성테이블간의 조인 후 데이터 내보내기 코드 샘플입니다.

일반적으로 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;
        }
    }
}