[C#] [ArcGIS] [Engine] 0x002 數據添加(Shp、柵格、CAD、數據庫等)

目錄

1.Intro

2.Environment

3.Source

4.Conclusion


1.Intro

關於數據添加,已經寫成了通用方法,也可以編譯成庫調用,直接看代碼↓↓↓

2.Environment

Environment:Windows 7及以上

Language:C#

IDE:Visual Studio 2012

SDK:ArcGIS Engine 10.2

3.Source

    [Guid("c4513d9a-c1e0-462f-8ed1-0bb09745b706")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Libs_GIS.Add_Data")]
    public sealed class Add_Data
    {
        #region 添加地圖文檔數據

        /// <summary>
        /// 從文件添加MXD文檔
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="mxd_FullPath">Mxd文件全路徑</param>
        public static void Add_Data_MXD(AxMapControl axMapControl, string mxd_FullPath)
        {
            if (axMapControl.CheckMxFile(mxd_FullPath))
            {
                // 設置 axMapControl 控制鼠標指針圖標選項爲沙漏光標
                axMapControl.MousePointer = esriControlsMousePointer.esriPointerHourglass;
                // 傳入 LoadMxFile 方法的三個參數
                /*
                 * 1.mxPath:文件路徑
                 * 2.mapNameOrIndex:地圖名稱或索引
                 * 3.password:通過反射進行調用獲取參數的默認值
                 */
                axMapControl.LoadMxFile(mxd_FullPath, 0, Type.Missing);
                // 定義 axMapControl 控制鼠標指針圖標爲默認箭頭
                axMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
                // 全局顯示
                axMapControl.Extent = axMapControl.FullExtent;
            }
            else
            {
                string message = String.Format("<{0}>\r\t不是有效的地圖文檔!", mxd_FullPath);
                System.Windows.Forms.MessageBox.Show(message, "加載失敗", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
            }
        }

        #endregion

        #region 添加Shp數據

        /// <summary>
        /// 從文件添加Shapefile數據
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="shapefile_FullPath">Shp文件全路徑</param>
        public static void Add_Data_Shp_FromFile(AxMapControl axMapControl, string shapefile_FullPath)
        {
            FileInfo fileInfo = new FileInfo(shapefile_FullPath);
            string data_Directory = fileInfo.Directory.ToString();
            string data_Name = fileInfo.Name.ToString();

            // 1創建工作空間工廠,指定爲Shapefile類型
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            // 打開 Shapefile 文件名對應的工作空間
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(data_Directory, 0);
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            // 打開數據(要素類)
            IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(data_Name);
            // 創建要素圖層
            IFeatureLayer pFeatureLayer = new FeatureLayerClass();
            pFeatureLayer.FeatureClass = pFeatureClass;
            pFeatureLayer.Name = pFeatureClass.AliasName;
            // 關聯圖層和要素類
            ILayer pLayer = pFeatureLayer as ILayer;
            IMap pMap = axMapControl.Map;
            // 添加到地圖中
            pMap.AddLayer(pLayer);
            axMapControl.ActiveView.Refresh();
        }

        #endregion

        #region 添加圖層數據

        /// <summary>
        /// 從文件添加圖層
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="lyr_FullPath">圖層文件全路徑</param>
        public static void Add_Data_Lyr_FromFile(AxMapControl axMapControl, string lyr_FullPath)
        {
            axMapControl.AddLayerFromFile(lyr_FullPath);
            axMapControl.ActiveView.Refresh();
        }

        /// <summary>
        /// 從圖層添加圖層
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="pLayer">圖層對象</param>
        public static void Add_Data_Lyr_FromLayer(AxMapControl axMapControl, ILayer pLayer)
        {
            axMapControl.AddLayer(pLayer);
            axMapControl.ActiveView.Refresh();
        }

        #endregion     

        #region 添加數據庫數據

        /// <summary>
        /// 從GDB數據庫添加圖層
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="gdb_FullPath">GDB全路徑</param>
        public static void Add_Data_FromGDB(AxMapControl axMapControl, string gdb_FullPath)
        {
            #region 獲取工作空間
            FileGDBWorkspaceFactory pFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
            IWorkspace pWorkspace = pFileGDBWorkspaceFactory.OpenFromFile(gdb_FullPath, 0);
            #endregion

            //自定義一個方法,傳入工作空間和當前地圖控制窗體
            AddAllDataset(axMapControl, pWorkspace);
        }

        /// <summary>
        /// 從MDB數據庫添加圖層
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="mdb_FullPath">MDB全路徑</param>
        public static void Add_Data_FromMDB(AxMapControl axMapControl, string mdb_FullPath)
        { 
            #region 獲取工作空間
            //直接實例化AccessWorkspaceFactory(從Access工作空間工廠引出IWorkspace工作空間)
            AccessWorkspaceFactory pAccessWorkspaceFactory = new AccessWorkspaceFactory();
            IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(mdb_FullPath, 0);
            #endregion

            //自定義一個方法,傳入工作空間和當前地圖控制窗體
            AddAllDataset(axMapControl, pWorkspace);
        }

        /// <summary>
        /// 加載數據庫加載數據方法:添加所有數據集
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="pWorkspace">工作空間對象</param>
        private static void AddAllDataset(AxMapControl axMapControl, IWorkspace pWorkspace)
        {
            //從工作空間中獲取數據集並限定數據集的類型爲Any,然後賦值給IEnumDataset完成實例化,讓IEnumDataset可以獲取工作空間中的任意數據
            IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
            //將Enum數據集中的數據一個一個地讀到Dataset中
            IDataset pDataset = pEnumDataset.Next();
            //判斷數據集pDataset中是否有數據
            while (pDataset != null)
            {
                #region 判斷數據集是不是要素數據集類型
                if (pDataset is IFeatureDataset)
                {
                    IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
                    //在要素工作空間中檢測數據集中的數據名稱,並賦值給要素數據集
                    IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataset.Name);
                    //將要素數據集中包含的全部數據都賦值給IEnumDataset進行存儲
                    IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
                    //重置數據集序列,使指針位於第一個數據集之前
                    pEnumDataset1.Reset();

                    //創建組圖層,直接實例化
                    //IGroupLayer pGroupLayer = new GroupLayerClass();
                    //將要素數據集的名稱賦給組圖層的名稱
                    //pGroupLayer.Name = pFeatureDataset.Name;
                    //將Enum1數據集中的數據一個一個地讀到Dataset1中

                    IDataset pDataset1 = pEnumDataset1.Next();
                    //判斷數據集pDataset1中是否有數據
                    while (pDataset1 != null)
                    {
                        if (pDataset1 is IFeatureClass)//判斷數據集是不是要素類類型
                        {
                            IFeatureLayer pFeatureLayer = new FeatureLayerClass();
                            //從要素工作空間打開要素類,賦值給要素圖層的要素類屬性,傳入參數:數據集名稱
                            pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
                            if (pFeatureLayer.FeatureClass != null)
                            {
                                //將要素圖層中要素類的名稱屬性,賦值給要素圖層的名稱屬性
                                pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;

                                //pGroupLayer.Add(pFeatureLayer);

                                axMapControl.Map.AddLayer(pFeatureLayer);
                            }
                        }
                        pDataset1 = pEnumDataset1.Next();
                    }
                }
                #endregion

                #region 判斷數據集是不是要素類類型
                else if (pDataset is IFeatureClass)
                {
                    IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
                    IFeatureLayer pFeatureLayer = new FeatureLayerClass();
                    pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
                    pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
                    axMapControl.Map.AddLayer(pFeatureLayer);
                }
                #endregion

                #region 判斷數據集是不是柵格數據集類型
                else if (pDataset is IRasterDataset)
                {
                    IRasterWorkspaceEx pRasterWorkspace = pWorkspace as IRasterWorkspaceEx;
                    IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
                    //影像金字塔判斷與創建
                    IRasterPyramid3 pRasPyrid = pRasterDataset as IRasterPyramid3;
                    if (pRasPyrid != null)
                    {
                        if (!(pRasPyrid.Present))//如果金字塔圖層不存在
                        {
                            pRasPyrid.Create();//則創建一個金字塔
                        }
                    }
                    IRasterLayer pRasterLayer = new RasterLayerClass();
                    pRasterLayer.CreateFromDataset(pRasterDataset);
                    ILayer pLayer = pRasterLayer as ILayer;
                    axMapControl.AddLayer(pLayer, 0);
                }
                pDataset = pEnumDataset.Next();
                #endregion
            }
            axMapControl.ActiveView.Refresh();
        }

        #endregion

        #region 添加柵格數據

        /// <summary>
        /// 從文件添加柵格數據
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="raster_FullPath">柵格文件全路徑</param>
        public static void Add_Data_Raster_FromFile(AxMapControl axMapControl, string raster_FullPath)
        {
            #region 獲取文件路徑和文件名
            string raster_FilePath = System.IO.Path.GetDirectoryName(raster_FullPath);
            string raster_FileName = System.IO.Path.GetFileName(raster_FullPath);
            #endregion

            #region 實例化各類
            //通過 RasterWorkspaceFactory 組件類來實例化 IWorkspaceFactory 接口
            IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
            //調用IWorkspaceFactory接口對象的方法OpenFromFile並傳入參數:文件路徑,來實例化IWorkspace
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(raster_FilePath, 0);
            //將IWorkspace接口的對象賦值給IRasterWorkspace接口的對象,並轉換爲IRasterWorkspace類型,實現工廠到具體空間的轉換
            IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
            //通過IRasterWorkspace接口對象的方法OpenRasterDataset並傳入參數:文件名,來實例化IRasterDataset,實現柵格工作空間與柵格數據集的聯動
            IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(raster_FileName);
            //通過IRasterDataset接口對象的CreateDefaultRaster()方法創建一個默認的柵格賦值給IRaster接口對象進行實例化
            IRaster pRaster = pRasterDataset.CreateDefaultRaster();
            //通過RasterLayerClass組件類來實例化IRasterLayer接口
            IRasterLayer pRasterLayer = new RasterLayerClass();
            //調用IRasterLayer接口對象的CreateFromRaster方法並傳入參數:默認柵格,實現在當前圖層中柵格圖層的創建
            pRasterLayer.CreateFromRaster(pRaster);
            //將IRasterLayer接口對象賦值給ILayer接口對象,轉化爲ILayer類型實現對ILayer接口的實例化
            ILayer pLayer = pRasterLayer as ILayer;
            #endregion

            #region 影像金字塔判斷與創建
            //將IRasterDataset接口的對象賦值給IRasterPyramid3接口的對象並轉化爲IRasterPyramid3類型實現聯動
            IRasterPyramid3 pRasPyrmid = pRasterDataset as IRasterPyramid3;
            //判斷金字塔
            if (pRasPyrmid != null)//判斷柵格金字塔對象是否爲空(即柵格數據集是否存在)
            {
                if (!(pRasPyrmid.Present))//判斷是否存在柵格金字塔
                {
                    pRasPyrmid.Create();//如果不存在柵格金字塔,則創建一個柵格金字塔
                }
            }
            #endregion

            //在當前地圖文檔中添加圖層
            axMapControl.AddLayer(pLayer, 0);
            axMapControl.ActiveView.Refresh();
        }

        #endregion

        #region 添加CAD數據

        /// <summary>
        /// 從文件分圖層添加CAD數據
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="cad_FullPath">CAD文件全路徑</param>
        public static void Add_Data_CAD_Layered_FromFile(AxMapControl axMapControl, string cad_FullPath)
        {
            #region//獲取文件路徑和文件名
            string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
            string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
            #endregion

            #region//加載CAD文件中的線文件
            //通過CadWorkspaceFactory組件類對WorkspaceFactory接口進行實例化,並強轉爲WorkspaceFactory類型,實現聯動
            WorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactory() as WorkspaceFactory;
            //通過WorkspaceFactory接口的OpenFromFile方法並傳入參數:文件全路徑,實現對IFeatureWorkspace接口的實例化,強轉爲IFeatureWorkspace類型
            IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(cad_FullPath, 0) as IFeatureWorkspace;
            //通過IFeatureWorkspace接口對象的方法OpenFeatureClass並傳入參數:文件名,實現對IFeatureClass接口的實例化
            IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(cad_FileName + ":Polyline");
            //通過FeatureLayerClass組件類對IFeatureLayer接口進行實例化,聯動要素圖層和要素類
            IFeatureLayer pFeatureLayer = new FeatureLayerClass();
            //將文件名賦值給要素圖層名
            pFeatureLayer.Name = cad_FileName;
            //將要素類賦值給要素圖層實現關聯
            pFeatureLayer.FeatureClass = pFeatureClass;
            #endregion

            axMapControl.Map.AddLayer(pFeatureLayer);
            axMapControl.ActiveView.Refresh();
        }

        /// <summary>
        /// 從文件整幅圖添加CAD數據
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="cad_FullPath">CAD文件全路徑</param>
        public static void Add_Data_CAD_Whole_FromFile(AxMapControl axMapControl, string cad_FullPath)
        {
            #region//獲取文件路徑和文件名
            string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
            string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
            #endregion

            #region//打開CAD數據集
            WorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass() as WorkspaceFactory;
            //工作空間工廠 中存在若干 要素工作空間
            IFeatureWorkspace pFeatureWorksapce = pWorkspaceFactory.OpenFromFile(cad_FileName, 0) as IFeatureWorkspace;
            //要素工作空間 中存在若干 要素數據集
            IFeatureDataset pFeatureDataset = pFeatureWorksapce.OpenFeatureDataset(cad_FileName);
            //要素類包含者 可以管理 要素數據集中的每一個要素類
            IFeatureClassContainer pFeatureClassContainer = pFeatureDataset as IFeatureClassContainer;

            //對CAD文件的要素進行遍歷處理
            for (int i = 0; i < pFeatureClassContainer.ClassCount; i++)
            {
                //通過要素類包含者 獲取到要素數據集中的 每一個要素類,並複製給要素類(無需強轉)
                IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);
                IFeatureLayer pFeatureLayer;
                //如果是註記,則添加註記圖層
                if (pFeatureClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation)
                {
                    //要素圖層可以是CAD的註記圖層
                    pFeatureLayer = new CadAnnotationLayerClass();
                    pFeatureLayer.Name = pFeatureClass.AliasName;
                    //將要素類 複製給 要素圖層的要素類屬性
                    pFeatureLayer.FeatureClass = pFeatureClass;
                    axMapControl.Map.AddLayer(pFeatureLayer);
                }
                else//如果是點、線、面,則添加要素層
                {
                    //要素圖層可以是要素圖層類
                    pFeatureLayer = new FeatureLayerClass();
                    pFeatureLayer.Name = pFeatureClass.AliasName;
                    pFeatureLayer.FeatureClass = pFeatureClass;
                    axMapControl.Map.AddLayer(pFeatureLayer);
                }
                axMapControl.ActiveView.Refresh();
            }
            #endregion
        }

        /// <summary>
        /// 從文件作爲柵格添加CAD數據
        /// </summary>
        /// <param name="axMapControl">地圖控件對象</param>
        /// <param name="cad_FullPath">CAD文件全路徑</param>
        public static void Add_Data_CAD_AsRaster_FromFile(AxMapControl axMapControl, string cad_FullPath)
        {
            #region//獲取文件路徑和文件名
            string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
            string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
            #endregion

            #region 獲得CAD文件的數據集
            //通過工作空間工廠一層一層實現 ICadDrawingWorkspace 接口
            IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(cad_FilePath, 0);
            ICadDrawingWorkspace pCadDrawingWorkspace = pWorkspace as ICadDrawingWorkspace;

            //從ICadDrawingWorkspace工作空間接口中打開ICadDrawingDataset數據集
            ICadDrawingDataset pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(cad_FileName);
            //將CAD數據集添加到CAD圖層中
            ICadLayer pCadLayer = new CadLayerClass();
            pCadLayer.CadDrawingDataset = pCadDrawingDataset;
            #endregion

            axMapControl.Map.AddLayer(pCadLayer);
            axMapControl.ActiveView.Refresh();
        }

        #endregion
    }

4.Conclusion

不多比比,直接上代碼,都在註釋裏了兄弟。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章