用过ArcGIS的同志应该很清楚,将一个shp文件导入GDB大体上分两种情况,一是直接导入GDB中,二是导入GDB的要素数据集中,下面就介绍一下利用ArcEngine实现的方法,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.SystemUI;
namespace WindowsFormsApplication1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
// 导入数据
private void button1_Click(object sender, EventArgs e)
{
// 属性过滤器
IQueryFilter pQueryFilter = new QueryFilter();
pQueryFilter.AddField("FID");
pQueryFilter.WhereClause = "FID>=0 and FID<=4";
// 导入数据
IFeatureClass pFeatureClass = GetShapefile(@"C:\Users\DSF\Desktop\shp\point.shp");
bool ok = Import(pFeatureClass, pQueryFilter, @"C:\Users\DSF\Desktop\test.gdb", "ds", "aaa");
// 提示用户信息
if (ok)
{
MessageBox.Show("导入成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
else
{
MessageBox.Show("导入失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 获取shp文件
/// </summary>
/// <param name="filePath">shp文件路径</param>
/// <returns>要素类</returns>
private IFeatureClass GetShapefile(string filePath)
{
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
IWorkspaceFactoryLockControl pWorkspaceFactoryLockControl = pWorkspaceFactory as IWorkspaceFactoryLockControl;
if (pWorkspaceFactoryLockControl.SchemaLockingEnabled)
{
pWorkspaceFactoryLockControl.DisableSchemaLocking();
}
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(filePath));
return pFeatureClass;
}
/// <summary>
/// shp导入数据GDB
/// </summary>
/// <param name="pSourceFeatureClass">shp要素类</param>
/// <param name="pQueryFilter">过滤器</param>
/// <param name="directory">GDB路径</param>
/// <param name="datasetName">要素数据集名称</param>
/// <param name="className">要素类名称</param>
/// <returns>导入是否成功</returns>
private bool Import(IFeatureClass pSourceFeatureClass, IQueryFilter pQueryFilter, string directory, string datasetName, string className)
{
// 源数据工作空间(SHP)
IDataset pSourceDataset = pSourceFeatureClass as IDataset;
IFeatureClassName pSourceFeatureClassName = pSourceDataset.FullName as IFeatureClassName;
IWorkspace pSourceWorkspace = pSourceDataset.Workspace;
// 目标数据工作空间(GDB)
IWorkspaceFactory pTargetWorkspaceFactory = new FileGDBWorkspaceFactory();
IWorkspace pTargetWorkspace = pTargetWorkspaceFactory.OpenFromFile(directory, 0);
IFeatureWorkspace pTargetFeatureWorkspace = pTargetWorkspace as IFeatureWorkspace;
// 若要素数据集名称不为空,则获取该数据集
IFeatureDatasetName pTargetFeatureDatasetName = null;
if (!string.IsNullOrWhiteSpace(datasetName))
{
pTargetFeatureDatasetName = pTargetFeatureWorkspace.OpenFeatureDataset(datasetName).FullName as IFeatureDatasetName;
}
// 设置目标数据属性
IDataset pTargetDataSet = pTargetWorkspace as IDataset;
IWorkspaceName pTargetWorkspaceName = pTargetDataSet.FullName as IWorkspaceName;
IFeatureClassName pTargetFeatureClassName = new FeatureClassName() as IFeatureClassName;
IDatasetName pTargetDatasetName = pTargetFeatureClassName as IDatasetName;
pTargetDatasetName.WorkspaceName = pTargetWorkspaceName;
pTargetDatasetName.Name = className;
// 检查字段
IFieldChecker pFieldChecker = new FieldChecker();
pFieldChecker.InputWorkspace = pSourceWorkspace;
pFieldChecker.ValidateWorkspace = pTargetWorkspace;
// 字段转换
IFields pSourceFields = pSourceFeatureClass.Fields;
IFields pTargetFields = null;
IEnumFieldError pEnumFieldError = null;
pFieldChecker.Validate(pSourceFields, out pEnumFieldError, out pTargetFields);
// 数据转换
IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverter();
try
{
pFeatureDataConverter.ConvertFeatureClass(pSourceFeatureClassName, pQueryFilter, pTargetFeatureDatasetName, pTargetFeatureClassName, null, pTargetFields, "", 1000, 0);
return true;
}
catch
{
return false;
}
}
}
}
上面代码的含义如下:首先获取一个名称为point.shp的文件,利用属性过滤器获取其第0~4条数据,最后导入GDB中的要素数据集ds中,导入后的要素类名称为aaa。如果你想直接导入GDB,只需要把datasetName参数设置为空字符串或者null即可。其运行结果如下: