地图数据的加载

一、加载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)的更多相关文章

  1. ArcGIS Engine开发之地图基本操作(4)

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

  2. ArcGIS Engine开发之地图基本操作(2)

    地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...

  3. ArcGIS Engine开发之地图基本操作(1)

    ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...

  4. ArcGIS Engine开发之地图浏览

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

  5. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...

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

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

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

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

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

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

  9. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

随机推荐

  1. requests源码阅读学习笔记

    0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...

  2. [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析

    本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...

  3. 【腾讯Bugly干货分享】微信终端跨平台组件 Mars 系列 - 我们如约而至

    导语 昨天上午,微信在广州举办了微信公开课Pro.于是,精神哥这两天的朋友圈被小龙的"八不做"刷屏了.小伙伴们可能不知道,下午,微信公开课专门开设了技术分论坛.在分论坛中,微信开源 ...

  4. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  5. CSS3 滤镜

    了解摄影活着美图秀秀之类美图软件的同学对滤镜肯定不陌生,CSS3对各种滤镜效果有了支持,可以做出很多好玩儿效果,走马观花了解一下 语法 filter: function(param); 很很多CSS3 ...

  6. vue-router疑惑点记录

    以vue-router2.x讲解. 1.定义路由时,某路由对象里同时有component和redirect重定向参数,会怎样处理? 答: 忽略component,直接用redirect的值重定向到新路 ...

  7. MSSQL 基础语句笔记

    建库 CREATE DATABASE 数据库名 ON[PRIMARY] --默认属于PRIMARY主文件组,可省略 ( NAME='', --主数据文件的逻辑名 名称 FILEAME='', --主数 ...

  8. [转]Fiddler抓取Android真机上的HTTPS包

    此篇文章转载自:http://blog.csdn.net/roland_sun/article/details/30078353 工作中经常会需要对一些app进行抓包, 但是每次默认都是只抓http请 ...

  9. Atitit 图像处理 调用opencv 通过java  api   attilax总结

    Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...

  10. 修改linux的hosts 后提示“无效的参数”

    碰到个问题,修改linux的主机名问题. vim /etc/hosts 192.168.154.129 129192.168.154.132 132192.168.154.133 133 本地ip是1 ...