2、 打开文件数据库:
public IWorkspace GetFGDBWorkspace(String _pGDBName) {
IWorkspaceFactory pWsFac = new FileGDBWorkspaceFactoryClass(); IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName, 0); return pWs; }
3、 打开SDE数据库:
打开SDE数据库我们使用的是Open方法,要用这个方法,我们就要对IPropertySet对象设置,要打开SDE数据库,我们要获取SDE数据库的服务器地址,数据库实例,数据库,用户,密码等参数。而IPropertySet就好比一个Key-Value的对象,用来帮组我们设置这些,然后传到Open方法中。
public IWorkspace GetSDEWorkspace(String _pServerIP, String _pInstance, String _pUser, String _pPassword, String _pDatabase, String _pVersion) {
ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass(); pPropertySet.SetProperty(\, _pServerIP); pPropertySet.SetProperty(\, _pInstance); pPropertySet.SetProperty(\, _pDatabase); pPropertySet.SetProperty(\, _pUser);
pPropertySet.SetProperty(\, _pPassword); pPropertySet.SetProperty(\, _pVersion);
ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 workspaceFactory; workspaceFactory = (ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2)new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass(); return workspaceFactory.Open(pPropertySet, 0); }
注意,打开SDE数据库需要用到ArcGIS Engine运行时的企业级许可。(即此时的License需要特别设置——ArcEngine的Lisence应使用企业数据库类型,在From1_Load事件中初始化lisence,不能使用lisence控件设置,否则提示没有许可lisence。)
具体的解决代码如下:
private void From1_Load(object sender,EventArg e) {
IAoInitialize pao=new AoInitializeClass();
pao.Initialize(esriLisenceProductCode.esriLisenceProductCodeEngineGeoDB); }
4.4.2 获取数据库中的要素类
在ArcGIS Engine中,要得到某一个类,首要要获取工作空间,然后进入工作空间再得到相应的东西,也就是以下两个步骤: ?获取工作空间; ?获取相应的要素类。
我们定义一个函数用来获取个人数据库的路径
public string WsPath() {
string WsFileName=\
OpenFileDialog OpenFile = new OpenFileDialog(); OpenFile.Filter = \个人数据库(MDB)|*.mdb\ DialogResult DialogR = OpenFile.ShowDialog(); if (DialogR == DialogResult.Cancel) { } else {
WsFileName = OpenFile.FileName; }
return WsFileName;
}
要获取要素类,首先获取工作空间,然后对工作空间中的要素类进行遍历,代码如下:
private void button2_Click(object sender, EventArgs e) {
string WsName = WsPath(); if (WsName != \ {
IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0);
IEnumDataset pEDataset =pWs.get_Datasets(esriDatasetType.esriDTAny); IDataset pDataset = pEDataset.Next(); while (pDataset != null) {
if (pDataset.Type ==esriDatasetType.esriDTFeatureClass) {
FeatureClassBox.Items.Add(pDataset.Name); }
//如果是数据集
else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset) {
IEnumDataset pESubDataset = pDataset.Subsets; IDataset pSubDataset = pESubDataset.Next(); while (pSubDataset != null) {
FeatureClassBox.Items.Add(pSubDataset.Name);// ----这是从哪里来的???------------ pSubDataset = pESubDataset.Next(); } }
pDataset = pEDataset.Next(); } }
FeatureClassBox.Text = FeatureClassBox.Items[0].ToString(); }
判断要素是否被编辑:
ArcGIS Engine 提供了一个IDatasetEdit的接口用来判断我们的数据是否处于编辑状态,该接口只有一个方法
,
如
下
:
示例代码如下:
public bool ISEdit (IFeatureClass pFeatureClass) {
IDatasetEdit pDataEdit = pFeatureClass as IDatasetEdit; return pDataEdit.IsBeingEdited(); }
如何删除要素类:
IFeatureWorkspace这个接口主要是用于管理基于矢量数据的,如表,要素类,要素数据集等。
要想删除一个要素类,那么必须先得到这个。,如要打开一个名称为PointTest的要素类,只需要在OpenFeatureClass中传入这个要素类的名称,代码如下:
IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass(\
如果是在ArcMap中,我们会切换到Catalog中然后进入相应的数据库,然后删除相应的要素类,这种操作会让我们想到FeatureClas这个对象会提供删除的方法,其实不然,这个删除的方法是定义在Dataset这个对象中。
private void button1_Click(object sender, EventArgs e) {
string WsName = WsPath(); if( WsName !=\ {
IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass(\IDataset pDatset = pFClass as IDataset; pDatset.Delete(); } } 删除前:
删除后:
创建要素类
创建要素类用到了IFeatureWorkspace.CreateFeatureClass方法。
所需接口:
IField,IFieldEdit,IFields,IFieldsEdit,IGeometryDef,
IGeometryDefEdit接口