Arcgis Engine(ae)接口详解(6):workspace操作
2017-10-08 00:00
531 查看
//此处用的workspace来源与用户选择 IWorkspace workspace = null; //workspace一般等同于数据库 //工作空间类型,也可理解为数据库类型 //esriFileSystemWorkspace:可能为shp //esriLocalDatabaseWorkspace:可能为file gdb,mdb //esriRemoteDatabaseWorkspace:可能为sde esriWorkspaceType workspaceType = workspace.Type; //路径,对于本地文件类型的(例如shp,file gdb,mdb)有意义,就是他们的文件路径 string path = workspace.PathName; //数据库连接配置,通常对于sde有效 IPropertySet propertySet = workspace.ConnectionProperties; //以下是遍历他的值的代码 object objNames = null; object objValue = null; //获取所有值,结构是类似字段的key/value格式,参数1是name的数组,参数2是value的数组 //参数类型是object,但实际分别是string数组和object数组 propertySet.GetAllProperties(out objNames, out objValue); string[] names = (string[])objNames; object[] values = (object[])objValue; //遍历获取各个值 for (int i = 0; i < names.Length; i++) { //参数名 string name = names[i]; //参数值 string value = values[i].ToString(); } //以下代码由于不具备测试数据,只看代码不运行 if (1 == 2) { //执行原生sql //如果Workspace数据类型是数据库如sde,可以通过此方法执行原生sql //这里只能执行不返回结果的sql,例如insert,update等,而不能select workspace.ExecuteSQL("update xxx set eee=111"); } //PS:以上代码可以获取sde数据库的配置,但密码获取到的是乱码,因为想在ae获取sde完整的连接参数(通常用于再次新建对sde的连接)是不可能的 //遍历workspace下所有的数据集 //get_Datasets方法用于获取workspace下的成员,参数1是获取的数据类型 //IEnum开头的接口类似于游标,用于遍历一些查询结果 IEnumDataset enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); enumDataset.Reset(); //因为下面还要遍历数据集下的featureClass,因此用了IFeatureDataset,其实也可以as到IDataset IFeatureDataset featureDataset = null; while ((featureDataset = enumDataset.Next() as IFeatureDataset) != null) { //数据集的基础属性 IDataset dataset = featureDataset as IDataset; //数据集名称 string datasetName = dataset.Name; //数据集类型 esriDatasetType datasetType = dataset.Type; //IGeoDataset是几何相关的接口 IGeoDataset geoDataset = featureDataset as IGeoDataset; //空间参考 ISpatialReference spatialReference2 = geoDataset.SpatialReference; //获取数据集下所有的featureClass IFeatureClassContainer featureClassContainer = featureDataset as IFeatureClassContainer; IEnumFeatureClass enumFeatureClass = featureClassContainer.Classes; enumFeatureClass.Reset(); IFeatureClass featureClass = null; //遍历数据集里的要素类 while ((featureClass = enumFeatureClass.Next()) != null) { } //IEnum开头的接口用完都要手动释放(与游标一样) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumFeatureClass); } //IEnum开头的接口用完都要手动释放(与游标一样) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //遍历workspace下的featureClass //PS:结合上面的代码可以注意到,获取数据集下的featureClass和获取workspace下的featureClass的代码是分开的 enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass); enumDataset.Reset(); IFeatureClass featureClass2 = enumDataset.Next() as IFeatureClass; while ((featureClass2 = enumDataset.Next() as IFeatureClass) != null) { } //IEnum开头的接口用完都要手动释放(与游标一样) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //获取Workspace的所有FeatureClass(包括Dataset里面的) List<IFeatureClass> lstFeatureClass = WorkspaceEdmHelper.GetAllFeatureClassInWorkspace(workspace as IFeatureWorkspace); //Workspace关于featureClass操作的接口 IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; //以下代码由于不具备测试数据,只看代码不运行 if (1 == 2) { //通过名称获取featureClass //PS:即使featureClass在数据集下也可以这样获取,这点跟遍历不同 featureClass2 = featureWorkspace.OpenFeatureClass("www"); //通过名称获取数据集 featureDataset = featureWorkspace.OpenFeatureDataset("rrr"); //通过文件路径或数据库连接参数,新建数据库或打开数据库 //创建File Gdb,参数1是文件所在文件夹,参数2是数据库名称 //由于一个file gdb数据库等同于一个workspace,因此创建file gdb等同于创建workspace featureWorkspace = WorkspaceEdmHelper.CreateFileGdb("C:\\aaa", "test.gdb"); //创建personal gdb(mdb),参数1是文件所在文件夹,参数2是数据库名称 featureWorkspace = WorkspaceEdmHelper.CreatePersonalGdb("C:\\aaa", "test.mdb"); }
被调用的封装函数代码如下
/// <summary> /// 获取Workspace的所有FeatureClass(包括Dataset里面的) /// </summary> /// <param name="featureWorkspace"></param> /// <returns></returns> public static List<IFeatureClass> GetAllFeatureClassInWorkspace(IFeatureWorkspace featureWorkspace) { IWorkspace workspace = featureWorkspace as IWorkspace; List<IFeatureClass> featureClassResult = new List<IFeatureClass>(); //首先遍历数据集 IEnumDataset enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); enumDataset.Reset(); IFeatureDataset featureDataset = enumDataset.Next() as IFeatureDataset; while (featureDataset != null) { IFeatureClassContainer featureClassContainer = featureDataset as IFeatureClassContainer; IEnumFeatureClass enumFeatureClassTarget = featureClassContainer.Classes; enumFeatureClassTarget.Reset(); IFeatureClass featureClass = enumFeatureClassTarget.Next(); //遍历数据集里的要素类 while (featureClass != null) { featureClassResult.Add(featureClass); featureClass = enumFeatureClassTarget.Next(); } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumFeatureClassTarget); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureDataset); featureDataset = enumDataset.Next() as IFeatureDataset; } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //然后遍历在数据库根目录的要素类 enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass); enumDataset.Reset(); IFeatureClass featureClass2 = enumDataset.Next() as IFeatureClass; while (featureClass2 != null) { featureClassResult.Add(featureClass2); featureClass2 = enumDataset.Next() as IFeatureClass; } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); return featureClassResult; } /// <summary> /// 创建Fiel Gdb /// </summary> /// <param name="directory"></param> /// <param name="gdbName"></param> /// <returns></returns> public static IFeatureWorkspace CreateFileGdb(string directory, string gdbName) { IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass(); IName name = (IName)workspaceFactory.Create(directory, gdbName, null, 0); return (IFeatureWorkspace)name.Open(); } /// <summary> /// 创建Personal Gdb(Mdb) /// </summary> /// <param name="directory"></param> /// <param name="gdbName"></param> /// <returns></returns> public static IFeatureWorkspace CreatePersonalGdb(string directory, string gdbName) { IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass(); IName name = (IName)workspaceFactory.Create(directory, gdbName, null, 0); return (IFeatureWorkspace)name.Open(); }
相关文章推荐
- Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除
- Arcgis Engine(ae)接口详解(2):featureClass查询
- Arcgis Engine(ae)接口详解(4):featureClass的feature插入
- Arcgis Engine(ae)接口详解(5):IGeometry几何基础操作
- Arcgis Engine(ae)接口详解(5):IGeometry几何高级操作
- Arcgis Engine(ae)接口详解(8):临时元素(element)
- Arcgis Engine(ae)接口详解(7):地图(map)操作
- Arcgis Engine(ae)接口详解(1):featureClass
- PHP接口开发签名验证原理详解
- php Iterator 接口详解
- java抽象类详解以及与接口区别
- Android 回调接口是啥,回调机制详解
- 微信JS-SDK之图像接口开发详解
- 利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
- java的接口详解
- mybatis如何通过接口查找对应的mapper.xml及方法执行详解
- 利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
- LCD的接口类型详解
- 微信JS接口汇总及使用详解(转)
- JavaSE第八十四讲:Observable类与Observer接口详解,深入理解观察者模式