Arcgis Engine(ae)接口详解(6):workspace操作

                //此处用的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");                   
                }

 

posted @ 2019-06-23 20:56  cannel  阅读(1672)  评论(0编辑  收藏  举报