[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

不多比比,直接上代码,都在注释里了兄弟。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr_Asada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值