ArcGIS Engine开发之地图基本操作(3)
地图数据的加载
一、加载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(, pIndex);//文件路径
string pFileName = pFullPath.Substring(pIndex + );//文件名
//实例化ShapefileWorkspaceFactory工作空间,打开Shapefile文件
pWorkspaceFactory = new ShapefileWorkspaceFactory();
pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, );
//创建实例化要素集
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 ,);//获取栅格文件的工作区
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 ,);
}
三、加载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(,pIndex );
string pFileName = pFullPath.Substring(pIndex +);
IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactory();
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, );
//加载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(, pIndex);
string pFileName = pFullPath.Substring(pIndex + );
//打开CAD数据集
IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactory();
pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, );
//打开一个要素集
IFeatureDataset pFeaturDataset = pFeatureWorkspace.OpenFeatureDataset(pFileName );
//IFeatureClassContainer可以管理IFeatureDataset中的每一个要素
IFeatureClassContainer pFeatuerClassContainer = (IFeatureClassContainer)pFeaturDataset;
ClearAllData();
//对CAD文件中的要素进行遍历处理
for (int i = ; 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(, pIndex);
string pFileName = pFullPath.Substring(pIndex + );
pCadWorkspaceFactory = new ESRI.ArcGIS.DataSourcesFile.CadWorkspaceFactoryClass();
pWorkspace = pCadWorkspaceFactory.OpenFromFile(pFilePath,);
pCadDrawingWorkspace=(ICadDrawingWorkspace)pWorkspace ;
//获得CAD文件的数据集
pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(pFileName );
pCadLayer = new CadLayerClass();
pCadLayer.CadDrawingDataset = pCadDrawingDataset;
mainMapControl.Map.AddLayer(pCadLayer);
mainMapControl.ActiveView.Refresh(); }
ArcGIS Engine开发之地图基本操作(3)的更多相关文章
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- ArcGIS Engine开发之地图基本操作(2)
地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...
- ArcGIS Engine开发之地图基本操作(1)
ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...
- ArcGIS Engine开发之地图浏览
地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线 ...
- ArcGIS Engine开发之地图导出
关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...
- ArcGIS Engine开发前基础知识(2)
ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...
- C#,ArcGIS Engine开发入门教程
C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674 目录(?)[+] 五实现 一 加载A ...
- ArcGIS Engine开发基础总结(一)
标准Engine功能 地图浏览 地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...
- ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...
随机推荐
- 认识ASP.NET 5项目结构和项目文件xproj
ASP.NET 5 在项目结构上做了很大的改变,我们以前熟悉的目录结构与项目文件内容都不太一样了,本篇文章带大家了解 ASP.NET 5 到底跟以前有哪些不一样的地方. 我们先用 Visual Stu ...
- 页面与ViewModel(上)
在UWP淘宝与旺信中,笔者主要负责页面与控件的制作,这些工作看似简单,但要想做的全面细致仍然需要深入的思考.本文想分享一些在UWP旺信的制作过程中,笔者在UI页面与控件制作上体会到的一些心得.可能笔者 ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- Visual Studio Code,完美的编辑器
今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...
- ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发
ABP代码生成器介绍 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始化.多语言.automapper自动注 ...
- ABP源码分析四十三:ZERO的本地化
ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种语言 ...
- ABP框架 - 工作单元
文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另 ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Linex 配置php服务器
此文是可以参考 楼主也不是系统管理员只是迫不得已所以自己才找的 大家可以参考 .... ..... 安装apache 安装mysql 安装PHP 测试服务器 php -v 查询php的版本 就这些了 ...
- salesforce 零基础学习(六十)Wizard样式创建数据
项目中表之间关联关系特别多,比如三个表中A,B,C C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...