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");                   
                }

被調用的封裝函數代碼以下sql

/// <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();
        }
相關文章
相關標籤/搜索