地图数据的加载

一、加载Shapefile数据

Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式。加载Shapefile数据的方式有两种:①通过工作空间加载。②通过MapControl控件的AddShapefile方法加载。

1、通过工作空间加载Shapefile文件

通过工作空间加载Shapefile文件主要用到IMap、ILayer、IFeatureLayer和IFeatureClass四个接口。

1)IMap接口

IMap接口是对地图进行操作的起点,主要用于管理Map对象中的图层对象、要素选择集和空间参考等对象。使用IMap接口,可以获取Map对象中的图层个数,对图层进行添加、删除,还可以利用IMap接口实现查询的高亮的显示。

2)ILayer接口

ILayer接口是图层对象的通用接口,它提供了操作图层的属性和方法,可用于所有的图层,如要素图层(FeatureLayer)、栅格图层(RasterLayer)和图形图层集合(CompositeGraphicsLayer)等

3)IFeatureLayer

IFeatureLayer接口继承自ILayer接口,提供了访问基于矢量数据图层的属性和方法,图层的数据可以是GeoDatabase、ShapeFile或者Coverage数据。如果使用FeatureLayer组件类,还可以通过IGeoFeatureLayer接口获取更多的属性和方法。IGeoFeatureLayer接口除了完全包含IFeatureLayer接口的属性和方法外,还提供了更多的控制要素图层的属性和方法,如注记属性(AnnotationPropperties)、注记显示设置(DisplayAnnotation)等。

4)IFeatureClass接口

IFeatureClass接口是获取和设置要素类属性的主要接口。如获取要素类的类型,得到满足某个查询条件的要素个数,或在要素类中创建一个新的功能等。

注意事项:Map、Layer、FeatureLayer三者之间的关系如下:Map是很多图层的集合,就像ArcMap的MXD文档一样,可以很多Layer;Layer是图层对象,是数据的外壳,必须建立在数据的基础上才有意义;FeatureLayer是具体的要素图层,需要经过Layer添加到Map中进行显示。

FeatureLayer、FeatureClass之间的区别:

1)FeatureLayer是加载在地图文档中的矢量数据层,只是要素类的表现形式。FeaturClass是一组空间实体的集合,在数据表中存储了统一的属性和行为,每一个FeatureClass都有一个Geometry类型。

2)FeatureLayer接口继承自ILayer接口,IFeatureClass接口继承自IClass接口。

3)FeatureLayer可以创建自己的对象,而FeatureClass不行;FeatureLayer、FeatureClass的获取方法如下:

IFeatureLayer pFeatureLayer=mainMapControl.get_layer(0) as IFeatureLayer;

IFeatureClass pFeatureClass=pFeatureLayer.FeatureClass;

具体的代码展示:

  OpenFileDialog pOpenFileDialog = new OpenFileDialog();pOpenFileDialog.CheckFileExists = true;//值检查pOpenFileDialog.Title = "打开Shape文件";pOpenFileDialog.Filter = "Shape文件(*.Shp)|*.shp";pOpenFileDialog.ShowDialog();//获取文件路径//分别实例化接口对象
            IWorkspaceFactory pWorkspaceFactory;IFeatureWorkspace pFeatureWorkspace;IFeatureLayer pFeatureLayer;string pFullPath = pOpenFileDialog.FileName;//
            if (pFullPath == "") return;int pIndex = pFullPath.LastIndexOf("\\");string pFilePath = pFullPath.Substring(0, pIndex);//文件路径string pFileName = pFullPath.Substring(pIndex + 1);//文件名//实例化ShapefileWorkspaceFactory工作空间,打开Shapefile文件pWorkspaceFactory = new ShapefileWorkspaceFactory();pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0);//创建实例化要素集IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName);pFeatureLayer = new FeatureLayer();pFeatureLayer.FeatureClass = pFeatureClass;pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;ClearAllData();//删除所有已加载的数据
            mainMapControl.Map.AddLayer(pFeatureLayer);mainMapControl.ActiveView.Refresh();//进行地图的刷新//同步鹰眼// SynchronizeEye();

2.通过MapControl的AddShapefile方法加载Shapefile文件

用MapControl控件的AddShapefile方法同样可加载Shapefile文件,这样省去了建立工作空间、数据集等步骤。调用该方法需要传入两个参数,分别是文件路径和不带扩展名的文件名。调用方法如下:

mainMapControl.AddShapefile(string Path,string filename);

二、加载栅格数据

栅格数据是GIS的数据源之一,主要有卫星影像、航空影像、扫描的地图和图片等。常见的栅格数据格式有:bmp、tif、jpg等。这几种栅格数据的工作空间是其所在的文件夹。添加栅格数据主要用到IRasterPyramid3、IRasterLayer等接口。

1)IRasterPyramid3接口

IRasterPyramid接口提供了对栅格数据集的 金字塔属性的访问,Present属性用于判断栅格数据集是否存在金字塔,Create方法用于为栅格数据创建金字塔。

2)IRasterLayer接口

IRasterLayer接口继承ILayer接口,CreateFromDataset方法用于已有的栅格数据集对象创建图层,CreateFromRaster方法用于已有栅格对象创建图层,Raster属性用于获取IRasterLayer接口中的Raster对象,DisplayResolutionFactor属性用于设置栅格数据的分辨率。

在实际的加载栅格文件的时候,需要引用ESRI。ArcGIS.DataSourcesRaster命名空间。思路:

(1)用IWorkspaceFactory接口的OpenFromFile方法获取栅格文件的工作区。

(2)用IRasterWorkspace接口的OpenRasterDataset方法获取栅格文件的数据集,实例化栅格文件对象,并对栅格数据集是否具有金字塔进行判断(如果栅格文件不具有金字塔就创建金字塔,可以大大提高数据量图像的显示效率)。

(3)创建RasterLayer类的实例pRasterLayer,并定义其数据集。

(4)使用MapControl控件的AddLayer方法将pRasterLayer添加至当前图层。

具体代码:

////添加栅格数据OpenFileDialog pOpenFileDialog = new OpenFileDialog();pOpenFileDialog.CheckFileExists = true;pOpenFileDialog.Title = "打开Raster文件";pOpenFileDialog.Filter = "栅格文件(*.*)|*.bmp;*.tif;*.jpg;*.img|(*.bmp)|*.bmp|(*.tif)|*.tif|(*.jpg)|*.jpg|(*.img)|*.img";pOpenFileDialog.ShowDialog();string pRasterFileName = pOpenFileDialog.FileName;if (pRasterFileName == "") return;string pPath = System.IO.Path.GetDirectoryName(pRasterFileName);//定义文件路径string pFileName = System.IO.Path.GetFileName(pRasterFileName);//定义文件名,获取路径中选择的文件名IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();//实例化工作空间工厂接口对象,用于实例工作空间对象IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pPath ,0);//获取栅格文件的工作区IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;//实例栅格空间对象IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pFileName );//获取栅格文件的数据集,实例化栅格文件对象//影像金字塔的判断与创建IRasterPyramid3 pRasPyrmid;//定义金字塔对象pRasPyrmid = pRasterDataset as IRasterPyramid3;if (pRasPyrmid != null){if (!(pRasPyrmid.Present))///判断是否具有金字塔
                {pRasPyrmid.Create();//创建金字塔
                }}IRaster pRaster;pRaster = pRasterDataset.CreateDefaultRaster();IRasterLayer pRasterLayer;//定义栅格图层pRasterLayer = new RasterLayer();//实例化栅格图层类pRasterLayer.CreateFromRaster(pRaster);//创建获取栅格数据集ILayer pLayer = pRasterLayer as ILayer;//实例化图层对象继承于栅格图层mainMapControl.AddLayer(pLayer ,0);}


三、加载CAD数据

CAD数据是GIS常用的一种数据源,很多GIS格式的数据都是从CAD文件转换而来的。对于ArcGIS Engine来说,有两种方式使用CAD数据:①作为要素图层,用矢量数据来使用;②作为地图背景,以栅格数据来使用。对于前者,ArcGIS Engine使用与FeatureLayer一样的方法来管理,对于后者采用CadLayer对象管理。

1.CAD文件作为矢量图层加载

当一个CAD文件被看作是一个矢量图层,表现为四种要素类型:即点、线、多边形和注记。这种区分并不是按照CAD文件本身的图层来做的,而是简单的考虑.dwg文件中的几何形体对象的类型。如一个dwg文件中有多个图层,而且这些图层都是线类型,那么他们将会区别地合并在一个要素图层中。点、线和多变形作为要素数据时,可以使用FeatureLayer对象,单CAD文件中的文字标注需要使用一个专门的注记图层(Annotation)而不是要素图层。

CAD作为矢量加载时有分层加载和整幅加载。

1)分幅加载

实现的思路:

①CAD数据可以分为点、线、面和注记,他们可以分别被加载到MapControl中,与加载其他数据一样,首先定义一个工作空间,用CADWorkspaceFactoryClass实例化工作空间,并打开相应的工作空间。

②创建FeatureLayers的实例,定义数据集,使用IMap接口的AddLayer方法将要素图层添加至当前地图。

代码如下:

  ///进行CAD数据的分层添加OpenFileDialog pOpenFileDialog = new OpenFileDialog();pOpenFileDialog.Title = "打开CAD数据文件";pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";pOpenFileDialog.ShowDialog();string pFullPath = pOpenFileDialog.FileName;if (pFullPath == "") return;//获取文件名和文件路径int pIndex = pFullPath.LastIndexOf("\\");string pFilePath = pFullPath.Substring(0,pIndex );string pFileName = pFullPath.Substring(pIndex +1);IWorkspaceFactory  pWorkspaceFactory = new CadWorkspaceFactory();IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0);//加载CAD文件中的线文件IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName +":polyline");IFeatureLayer pFeatureLayer = new FeatureLayer();pFeatureLayer.Name = pFileName;pFeatureLayer.FeatureClass = pFeatureClass;ClearAllData();//新增删除数据
            mainMapControl.Map.AddLayer(pFeatureLayer);mainMapControl.ActiveView.Refresh();

2)整幅图加载

实现的思路:将CAD作为整幅图加载时,在得到的相应的工作空间之后对CAD文件中的要素进行遍历,并判断是否为注记图层,如果是注记则需要使用CadAnnotationLayer对象。

代码如下:

   ////整幅图添加CAD文件数据OpenFileDialog pOpenFileDialog = new OpenFileDialog();pOpenFileDialog.Title = "打开CAD数据文件";pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";pOpenFileDialog.ShowDialog();string pFullPath = pOpenFileDialog.FileName;if (pFullPath == "") return;//获取文件名和文件路径int pIndex = pFullPath.LastIndexOf("\\");string pFilePath = pFullPath.Substring(0, pIndex);string pFileName = pFullPath.Substring(pIndex + 1);//打开CAD数据集IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactory();pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0);//打开一个要素集IFeatureDataset pFeaturDataset = pFeatureWorkspace.OpenFeatureDataset(pFileName );//IFeatureClassContainer可以管理IFeatureDataset中的每一个要素IFeatureClassContainer pFeatuerClassContainer = (IFeatureClassContainer)pFeaturDataset;ClearAllData();//对CAD文件中的要素进行遍历处理for (int i = 0; i < pFeatuerClassContainer.ClassCount; i++){IFeatureClass pFeatureClass = pFeatuerClassContainer.get_Class(i);//如果是注记就添加注记层if (pFeatureClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation){pFeatureLayer = new ESRI.ArcGIS.Carto.CadAnnotationLayerClass();pFeatureLayer.Name = pFeatureClass.AliasName;pFeatureLayer.FeatureClass = pFeatureClass;mainMapControl.Map.AddLayer(pFeatureLayer);}//如果是点线面则添加要素层else{pFeatureLayer = new FeatureLayer();pFeatureLayer.Name = pFeatureClass.AliasName;pFeatureLayer.FeatureClass = pFeatureClass;mainMapControl.Map.AddLayer(pFeatureLayer);}mainMapControl.ActiveView.Refresh();}//同步鹰眼//SynchronizedEagleEye;}

2、CAD文件作为栅格图层加载

在很多的情况下CAD数据仅仅用作背景显示而不参与矢量分析,这时候可以将CAD文件以栅格图层的方式加载,这时需要使用ICADLayer和ICadDrawingDataset两个接口。

1)ICadLayer接口:主要提供了对CAD文件属性信息的访问,如图名name、可见性visible等。

2)ICadDrawingDataset接口:提供了对CAD数据集成员的访问,可以通过ICadLayer接口的CadDrawingDataset 属性获取CAD数据。

3)实现的思路:

①用IWorkspaceFactory接口的OpenFromFile方法获得CAD文件为工作区。

②用ICadDrawingWorkspace接口的OpenCadDrawingDataset方法获得CAD文件的数据集,并将其值赋值给CadLayerClass类的实例化对象pCadLayer添加至当前地图。

具体的代码如下:

  IWorkspaceFactory pCadWorkspaceFactory;IWorkspace pWorkspace;ICadDrawingWorkspace pCadDrawingWorkspace;ICadDrawingDataset pCadDrawingDataset;ICadLayer pCadLayer;OpenFileDialog pOpenFileDialog = new OpenFileDialog();pOpenFileDialog.Title = "打开CAD数据文件";pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";pOpenFileDialog.ShowDialog();string pFullPath = pOpenFileDialog.FileName;if (pFullPath == "") return;//获取文件名和文件路径int pIndex = pFullPath.LastIndexOf("\\");string pFilePath = pFullPath.Substring(0, pIndex);string pFileName = pFullPath.Substring(pIndex + 1);pCadWorkspaceFactory = new ESRI.ArcGIS.DataSourcesFile.CadWorkspaceFactoryClass();pWorkspace = pCadWorkspaceFactory.OpenFromFile(pFilePath,0);pCadDrawingWorkspace=(ICadDrawingWorkspace)pWorkspace ;//获得CAD文件的数据集pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(pFileName );pCadLayer = new CadLayerClass();pCadLayer.CadDrawingDataset = pCadDrawingDataset;mainMapControl.Map.AddLayer(pCadLayer);mainMapControl.ActiveView.Refresh();}

ArcGIS Engine开发之地图基本操作(3)相关推荐

  1. ArcGIS Engine开发之地图浏览

    地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线 ...

  2. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  3. 【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序

    摘要:在ArcGIS 9的家族中,增加了两个新产品:ArcGIS Engine和ArcGIS Server.由于它们各自分别在C/S领域和B/S领域的强大开发能力,一经推出就备受瞩目.其中ArcGIS ...

  4. ArcGIS Engine开发:框架/结构+对象库

    ArcGIS Engine开发:框架/结构+对象库 框架/结构: ArcGIS Engine 开发人员有权使用一系列的控制器,这些控制器 准许很多属性.事件和方法的使用.尽管一个简单的应用软件 仅仅通 ...

  5. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 -MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  6. C#,ArcGIS Engine开发入门教程

    利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 Dixon整理 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法 ...

  7. GIS二次开发:实验一 ArcGIS Engine 开发初步

    实验一 ArcGIS Engine 开发初步 一.实验目的 掌握ArcGIS Engine的安装: 熟悉ArcGIS Engine中几个常用的控件: 搭建第一个简单的ArcGIS Engine 程序: ...

  8. 使用ArcGIS Engine来实现地图的点击查询并闪烁

    使用ArcGIS Engine来实现地图的点击查询并闪烁 ArcGIS Engine没有提供在MapControl中点击查询的命令,只是提供了ReaderControl中的使用的点击查询的命令,下面的 ...

  9. ArcGIS Engine开发---图层符号化

    使用ServerStyle 如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS Engine开发中对应的是ServerStyle符号库,它的结构体系 ...

最新文章

  1. Mysql 批量写入数据 性能优化
  2. Java知多少(完结篇)
  3. 以列表形式输出_04 Python之列表、集合和字典的推导式
  4. Java StackTraceElement toString()方法与示例
  5. 用reposync 同步YUM源到本地,搭建本地YUM源服务器
  6. python截图直接在内存里调用_Python-按块上传FTP中的内存文件(由API调用生...
  7. linux性能测试cpu内存io,Linux下磁盘IO性能测试工具介绍
  8. IOS Socket 01-网络协议基础知识
  9. html语言空格怎么写,html的空格代码怎么写?
  10. 【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
  11. PyQt5 -- 安装与发布
  12. Windows下80端口被进程System占用的解决方法
  13. 21年寒假第二周周练 蒜厂年会(一)最大连续子序列和
  14. 深拷⻉和浅拷⻉区别是什么?
  15. 【油猴脚本】Hypothesis导出为markdown文件
  16. Matlab基础学习(中)
  17. 光遇为什么显示服务器连接错误,光遇服务器错误怎么办 光遇服务器错误问题解决办法-游侠手游...
  18. Multimodal Discriminative Binary Embedding for Large-Scale Cross-Modal Retrieval--2016.10高新波团队
  19. 第五讲 Virtual Box 安装(2)
  20. MySQL 汉字提取首字母、姓名首字母全拼、姓名转拼音

热门文章

  1. 静态路由的不通配置方式
  2. Maven 国内镜像
  3. Samba简单应用案例
  4. Updater Application Block for .net 2.0 发布了
  5. python工作技巧_4个基本的 Python 技巧让你的工作流程自动化
  6. Android 修改actionbar标题的颜色和背景色
  7. cocos2D创建一组单选按钮菜单
  8. 深度解析Android中字体设置
  9. android中json解析及使用 (下)
  10. a new weekday