一个转换类,将ArcSDE上特定要素数据集转到本地的MDB中
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geoprocessor;
using ESRI.ArcGIS.ConversionTools;
using ESRI.ArcGIS.Geoprocessing;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.esriSystem;
namespace EngineWindowsApplication1
{
class C_SDEToLocalMDB
{
/// <summary>
/// 基于Oracle的SDE要素数据集转本地MDB要素数据集
/// </summary>
/// <param name="IN_Parameters">参数数组[0]:实例 [1]:用户名 [2]:密码</param>
/// <param name="IN_MDBFile">生成的本地MDB的路径</param>
/// <param name="IN_MDBName">生成的MDB的名字</param>
/// <param name="IN_FeatureClassName">SDE上目标要素类的名称</param>
public C_SDEToLocalMDB(string[] IN_Parameters, string IN_MDBFile, string IN_MDBName, string IN_FeatureClassName)
{
IWorkspace2 Temp_SDEWorkspace;//SDE上工作空间
#region 连接SDE
try
{
//通过IPropertySet设置通过SDE连接数据库的各种参数
IPropertySet Temp_PropertySet = new PropertySetClass();
Temp_PropertySet.SetProperty("INSTANCE", IN_Parameters[0]);// 数据库实例
Temp_PropertySet.SetProperty("USER", IN_Parameters[1]);//用户名
Temp_PropertySet.SetProperty("PASSWORD", IN_Parameters[2]);//密码
IWorkspaceFactory Temp_WorkFactory = new SdeWorkspaceFactory();
Temp_SDEWorkspace = (IWorkspace2)Temp_WorkFactory.Open(Temp_PropertySet, 0);
}
catch
{
return;
}
#endregion
//打开SDE上的目标要素数据集
IFeatureDataset Temp_SdeFeatureDataset = (Temp_SDEWorkspace as IFeatureWorkspace).OpenFeatureDataset(IN_FeatureClassName);
//构建本地MDB
IWorkspaceFactory Temp_LocalAccessWorkFactory = new AccessWorkspaceFactory();
string Temp_MDBFile = IN_MDBFile + IN_MDBName + ".mdb";
string Temp_LDBFile = IN_MDBFile + IN_MDBName + ".ldb";
if (File.Exists(Temp_MDBFile))//清理MDB和LDB文件
{
File.Delete(Temp_MDBFile);
if (File.Exists(Temp_LDBFile))
File.Delete(Temp_LDBFile);
}
Temp_LocalAccessWorkFactory.Create(IN_MDBFile, IN_MDBName, null, 0);//创建一个MDB
//本地MDB的工作空间
IFeatureWorkspace Temp_MDBWorkspace = Temp_LocalAccessWorkFactory.OpenFromFile(Temp_MDBFile, 0) as IFeatureWorkspace;
//在本地创建同名要素数据集
IFeatureDataset Temp_LocalDataset = Temp_MDBWorkspace.CreateFeatureDataset(IN_FeatureClassName, (Temp_SdeFeatureDataset as IGeoDataset).SpatialReference);
//批量导入要素类
for (int i = 0; i < (Temp_SdeFeatureDataset as IFeatureClassContainer).ClassCount; i++)
{
PRV_ConvertFeatureClass(Temp_SdeFeatureDataset.Workspace, Temp_LocalDataset, (Temp_SdeFeatureDataset as IFeatureClassContainer).get_Class(i).AliasName, (Temp_SdeFeatureDataset as IFeatureClassContainer).get_Class(i).AliasName);
}
}
/// <summary>
/// 将一个要素类从一个工作空间转移到另外一个工作空间
/// 注意目标工作空间不能有改要素类,必须先清除
/// </summary>
/// <param name="IN_SourceWorkspace">源工作空间</param>
/// <param name="IN_TargetWorkspace">目标要素数据集</param>
/// <param name="IN_SourceFeatureClassName">源要素类名</param>
/// <param name="IN_TargetFeatureClassName">目标要素类名</param>
private void PRV_ConvertFeatureClass(IWorkspace IN_SourceWorkspace, IFeatureDataset IN_TargetWorkspace, string IN_SourceFeatureClassName, string IN_TargetFeatureClassName)
{
#region 环境配置
//创建源工作空间名
IDataset Temp_SourceWorkspaceDataset = (IDataset)IN_SourceWorkspace;
IWorkspaceName Temp_SourceWorkspaceName = (IWorkspaceName)Temp_SourceWorkspaceDataset.FullName;
//创建源要素数据集名
IFeatureClassName Temp_SourceFeatureClassName = new FeatureClassNameClass();
IDatasetName Temp_SourceDatasetName = (IDatasetName)Temp_SourceFeatureClassName;
Temp_SourceDatasetName.WorkspaceName = Temp_SourceWorkspaceName;
Temp_SourceDatasetName.Name = IN_SourceFeatureClassName;
//创建目标工作空间名
IDataset Temp_TargetWorkspaceDataset = (IDataset)IN_TargetWorkspace.Workspace;
IWorkspaceName Temp_TargetWorkspaceName = (IWorkspaceName)(Temp_TargetWorkspaceDataset.FullName);
//创建目标要素类名
IFeatureClassName Temp_TargetFeatureClassName = new FeatureClassNameClass();
IDatasetName Temp_TargetDatasetName = (IDatasetName)Temp_TargetFeatureClassName;
Temp_TargetDatasetName.WorkspaceName = Temp_TargetWorkspaceName;
Temp_TargetDatasetName.Name = IN_TargetFeatureClassName;
//创建目标要素数据集名
IFeatureDatasetName Temp_TargetFeatureDatasetName = new FeatureDatasetNameClass();
IDatasetName Temp_TargetDatasetName2 = (IDatasetName)Temp_TargetFeatureDatasetName;
Temp_TargetDatasetName2.WorkspaceName = Temp_TargetWorkspaceName;
Temp_TargetDatasetName2.Name = IN_TargetWorkspace.Name;
#endregion
//打开源要素类获取字段定义
ESRI.ArcGIS.esriSystem.IName Temp_SourceName = (ESRI.ArcGIS.esriSystem.IName)Temp_SourceFeatureClassName;
IFeatureClass Temp_SourceFeatureClass = (IFeatureClass)Temp_SourceName.Open();
//验证字段
IFieldChecker Temp_FieldChecker = new FieldCheckerClass();
IFields Temp_TargetFeatureClassFields;
IFields Temp_SourceFeatureClassFields = Temp_SourceFeatureClass.Fields;
IEnumFieldError enumFieldError;
Temp_FieldChecker.InputWorkspace = IN_SourceWorkspace;
Temp_FieldChecker.ValidateWorkspace = IN_TargetWorkspace.Workspace;
Temp_FieldChecker.Validate(Temp_SourceFeatureClassFields, out enumFieldError, out Temp_TargetFeatureClassFields);
//批量导入
IField Temp_GeometryField;
for (int i = 0; i < Temp_TargetFeatureClassFields.FieldCount; i++)
{
if (Temp_TargetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
{
Temp_GeometryField = Temp_TargetFeatureClassFields.get_Field(i);
//获取空间定义
IGeometryDef Temp_GeometryDef = Temp_GeometryField.GeometryDef;
IGeometryDefEdit Temp_TargetFCGeoDefEdit = (IGeometryDefEdit)Temp_GeometryDef;
Temp_TargetFCGeoDefEdit.GridCount_2 = 1;
Temp_TargetFCGeoDefEdit.set_GridSize(0, 0);
Temp_TargetFCGeoDefEdit.SpatialReference_2 = Temp_GeometryField.GeometryDef.SpatialReference;
//定义筛选条件
IQueryFilter Temp_QueryFilter = new QueryFilterClass();
Temp_QueryFilter.WhereClause = "";
//导入要素类至要素数据集
IFeatureDataConverter Temp_FeatureDataConverter = new FeatureDataConverterClass();
IEnumInvalidObject enumErrors = Temp_FeatureDataConverter.ConvertFeatureClass(Temp_SourceFeatureClassName, Temp_QueryFilter, Temp_TargetFeatureDatasetName, Temp_TargetFeatureClassName, Temp_GeometryDef, Temp_TargetFeatureClassFields, "", 1000, 0);
break;
}
}
}
}
}