ArcGIS Engine控件编程.doc_第1页
ArcGIS Engine控件编程.doc_第2页
ArcGIS Engine控件编程.doc_第3页
ArcGIS Engine控件编程.doc_第4页
ArcGIS Engine控件编程.doc_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2 使用ArcGIS Engine控件编程在ESRI.ArcGIS.Controls命名空间中包含了可用于快速构建GIS独立应用程序的控件,如MapControl、PageLayoutControl、TOCControl和ToolbarControl等。其中MapControl和PageLayoutControl对应ArcMap桌面应用程序的“数据”和“布局”视图。前者封装了Map对象,用于地图数据的显示和分析,后者封装了PageLayout对象,用于地图的修饰和整理,以便生成一幅成品地图。这两个控件均实现了IMxdContents接口,可以读取和写入地图文档(MapDocument)。TOCControl和ToolbarControl控件分别对应ArcMap中的“Table of Contents”和各种工具条。这两个控件都需要一个“伙伴控件”协同工作,而伙伴控件则可以是MapControl、PageLayoutControl、SceneControl或GlobeControl。TOCControl用交互树视图的方式来显示伙伴控件的地图、图层和符号体系内容,并保持其内容与伙伴控件同步。而ToolbarControl则可以驻留操作其伙伴控件的命令、工具和菜单。在Visual Studio.NET环境中使用ArcGIS Engine开发GIS应用程序,需要使用ESRI interop程序集(Interop Assemblies),它为ArcGIS控件提供了能够位于.NET窗体上的控件,这些控件当被拖放在窗体上,生成具体的实例对象时,均有带有前缀“ax”。如axMapControl1,axPageLayoutControl1等。本章将详细介绍MapControl、PageLayoutControl、TOCControl和ToolbarControl四个常用控件,并在C#.NET开发平台上,结合GIS软件开发的基本需求进行讲述。2.1 MapControl控件 MapControl控件对应于ArcMap中的数据视图,它封装了Map对象,并提供了相应的属性、方法、事件,可以实现: (1)地图显示; (2)地图的放大、缩小和漫游; (3)生成点、线、面等图形元素; (4)识别地图上选中的元素,进行属性查询; (5)标注地图元素等。该控件能够实现ArcMap能够完成的绝大部分任务。该控件实现的主要接口包括IMapControlDefault、IMapControl2、IMapControl3、IMapControl4和事件接口IMapControlEvents2、IMxdContents、ITOCBuddyEvents。2.1.1 主要接口IMapControlDefault接口IMapControlDefault接口是MapControl的缺省接口,是代表控件最新版本的接口。一般的开发环境自动使用这个接口定义的属性和方法。在C#开发平台上,当用户将该控件拖放到窗体上时,会自动生成一个名为axMapControl1的对象,该对象可以直接使用缺省接口对应的属性和方法。该控件当前最新版本的接口为IMapControl4。定义该接口的变量,并进行实例化的方法如下: IMapControlDefault pMapcontrol; pMapcontrol = axMapControl1.Object as IMapControlDefault;IMapControl2接口该接口是所有与MapControl相关任务的出发点,包括设置控件外观、设置Map对象及控件的显示属性,添加、管理数据层,在控件上绘制图形并返回Geometry等。该接口定义了控制控件外观界面的各种属性,如Apperaance、BorderStyle和BackColor。它定义了AddLayer、AddLayerFromFile、AddshapeFile、CenterAt、ClearLayers、DeleteLayer、LoadMxFile、MoveLayerTo、Pan、ReadMxMaps等添加、移动、删除、清楚图层的方法,TrackLine、TrackPolygon、TrackRectangle和TrackCircle等让程序员可以直接在控件上获得Geometry对象的方法,外还提供了DrawShape和DrawText让程序员可以在控件上绘制图形的方法。IMapControl3接口该接口在继承IMapControl2的基础上,增加了以下属性和方法:1)CustomProperty:设置自定义控件属性;2)DoucumentFilename:返回加入MapControl中地图文档的文件名;3)DocumentMap:返回MapControl最后装入Map的名称;4)KeyIntercept:返回或设置MapControl截取的键盘按键信息,按键信息类型如表2.1所示。5)Object:返回潜在的MapControl控件。6)ShowMap Tips、TipDelay、TipStyle7)SuppressResizeDrawing():控件尺寸发生变化时,阻止数据实时重绘。表2.1 esriKeyIntercept可能取值枚举值Value功能描述EsriKeyInterceptNone0没有截取鼠标按键EsriKeyInterceptArrowKeys1截取了箭头按键EsriKeyInterceptAlt2截取了Alt按键EsriKeyInterceptTab4截取了Tab按键EsriKeyInterceptEnter8截取了回车按键IMapControl4接口该接口在IMapControl接口的基础上,增加了两个属性,分别是AutoKeyboardScrolling和AutoMouseWheel。IMapControlEvents2 接口 该接口为事件接口,它定义了MapControl能够处理的全部事件。 如OnMouseDown、OnMouseMove、OnAfterDraw、OnExtentUpdated等。这些事件,在实际GIS软件开发中经常用到,如AfterScreenDraw是绘屏结束后触发的事件,OnExtentUpdate是地图的Extent属性发生变化时触发的事件等。2.1.2 用MapControl控件加载地理数据用MapControl加载shape格式文件用MapControl控件的AddShapeFile方法可以加载shape格式文件,该方法包括两个参数,分别是文件路径和不带扩展名的文件名。调用格式如下: axMapControl1.AddShapeFile(strFilePath, strFilename);也可以利用工作空间工厂打开Shape文件。基本思路是,利用工作空间工厂抽象类的IWorkspaceFactory接口定义接口变量pWorkspaceFactory,再利用其子类ShapefileWorkspaceFactory对应的组件类ShapefileWorkspaceFactoryClass对pWorkspaceFactory进行实例化。利用IWorkspace接口定义工作空间变量pWorkspace,利用pWorkspaceFactory的OpenFromFile方法打开工作空间,对其进行实例化。该方法包含两个参数,第一参数为需要打开工作空间(数据库,即shape格式的文件)的路径。接下来利用IFeatureWorkspace接口定义接口变量pFeatureWorkspace,对该变量利用接口跳转的方式进行实例化:pFeatureWorkspace=pWorkspace as IFeatureWorkspace;利用IFeatureClass接口定义变量pFeatureClass,并对该变量利用pFeatureWorkspace的OpneFeatureClass方法进行实例化,该方法包含的参数是需要打开的shape文件名。定义数据集对象、特征图层对象,定义特征图层的特征数据类及特征图层的名称,再定义图层,最后将图层添加到MapControl的Map对象上,就能显示所选择的shape格式文件,具体代码如下所示。string WorkSpacePath =System.IO.Path.GetDirectoryName(strFileName); strShapeFileName=System.IO.Path.GetFileName(strFileName); IWorkspaceFactory pWorkspaceFactory=new ShapefileWorkspaceFactoryClass(); IWorkspace pWorkspace=pWorkspaceFactory.OpenFromFile(WorkSpacePath,0); IFeatureWorkspace pFeatureWorkspace=pWorkspace as IFeatureWorkspace; IFeatureClass pFeatureClass=pFeatureWorkspace.OpenFeatureClass(strShapeFileName); IDataset pDataset=pFeatureClass as IDataset; IFeatureLayer pFeatureLayer=new FeatureLayerClass(); pFeatureLayer.FeatureClass=pFeatureClass; pFeatureLayer.Name=pDataset.Name; ILayer pLayer=pFeatureLayer as ILayer; axMapControl1.Map.AddLayer(pLayer); 在上述两种方式中,到底哪种方式显示图形的效率高,需要进行测试。用MapControl加载MXD格式文件 MapControl控件可以“链接”或“包含”地图文档,若为链接文档,控件将保存对地图文档的引用,以后任何对文档的修改都会出现在控件上,若为“包含文档”,则控件会复制当前的文档状态,而不会受到后来修改的影响。 在AE编程中,可以直接使用MapControl的LoadMxFile方法载入地图文档。在进行加载时,一般需通过MapControl提供的方法CheckMxFile()检查所选文件是否是合法的MXD文档,若合法则调用MapControl提供的LoadMxFile方法打开文档。 if (axMapControl1.CheckMxFile(strFileName)/strFileName是用户所选地图文档文件 /加载MXD文档 axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; axMapControl1.LoadMxFile(strFileName, 0, Type.Missing); axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault; else MessageBox.Show(s所选文件不是地图文档文件!,信息提示); return; 若要加载某个地图文档中的特定地图,则需要先进行判断满足特定条件的地图,然后才加载地图文档文件。如下面的实例代码所示: if (axMapControl1.CheckMxFile(strFileName)/strFileName为地图文档文件 /是Mxd文档文件 IArray pArray; pArray = axMapControl1.ReadMxMaps(strFileName, Type.Missing); IMap pMap; for (int i = 0; i pArray.Count; i+) /QI接口跳转 pMap = pArray.get_Element(i) as IMap; if (pMap.Name = Layers) /加载文档对象中特定的Map对象 axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; axMapControl1.LoadMxFile(strFileName, 0, Type.Missing); axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault; else MessageBox.Show(所选文件不是地图文档文件!,信息提示); return; 用MapControl加载栅格格式文件 利用MapControl控件也可以加载诸如*.bmp、*.tif、*.jpg等各种栅格格式的文件,加载栅格格式文件,需要引入ESRI.ArcGIS.DataSourcesRaster命名空间。具体思路如下:利用工作空间工厂抽象类定义接口变量,利用工作空间工厂的子类RasterWorkspaceFactory对用的组件类RasterWorkspaceFactoryClass实例化工作空间工厂变量。接下来定义工作空间变量,并进行实例化,再定义栅格工作空间,并进行实例化,接下来定义栅格数据集,利用所选栅格数据文件进行实例化,并判断该文件是否具有金字塔,若没有则创建金字塔,以提高大数据量图像的显示效率。在此基础上定义栅格数据、栅格数据层和数据层,并完成向MapControl空间中添加数据层数据,具体实现代码参与以下实例: string pathName = System.IO.Path.GetDirectoryName(strFileName);/strFileName是栅格数据文件 string fileName = System.IO.Path.GetFileName(strFileName);IWorkspaceFactory pWSF;pWSF = new RasterWorkspaceFactoryClass();IWorkspace pWS;pWS = pWSF.OpenFromFile(pathName, 0);IRasterWorkspace pRWS;pRWS = pWS as IRasterWorkspace; IRasterDataset pRasterDataset; pRasterDataset = pRWS.OpenRasterDataset(fileName ); /影像金字塔判断与创建 IRasterPyramid pRasPyrmid; pRasPyrmid = pRasterDataset as IRasterPyramid; if (pRasPyrmid != null) if (!(pRasPyrmid.Present) pRasPyrmid.Create(); /在进度条中说明正在创建金字塔 IRaster pRaster;pRaster = pRasterDataset.CreateDefaultRaster(); IRasterLayer pRasterLayer; pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromRaster(pRaster); ILayer pLayer = pRasterLayer as ILayer; /向axMapControl1控件中添加栅格图层 axMapControl1.AddLayer(pLayer, 0);通过上面的讲述,可以体会MapControl控件的AddLayer方法、AddShapeFile方法、AddLayerFromFile方法等。另外,该控件还包括DeleteLayer和MoveLayerTo等方法。其它方法请查看MapControl的对象模型图,各种方法的具体使用请参阅ESRI ArcGIS Engine开发帮助文档。IMapDocument接口定义了操作和管理文档对象的方法和属性。MapDocument类能够封装地图文档文件,如mxd、mxt和pmf等,它也可以封装一个图层文件(*.lyr)。使用这个对象可以获取和更新一个文档的内容,设置文档文件的属性以及读、写和保存一个文档文件。下面举例说明打开、保存、另存一个文档文件,主要代码如下:/打开文档文件IMapDocument pMapDocument;/定义接口变量 pMapDocument = new MapDocumentClass();/实例化地图文档对象 /将数据加载入pMapDocument并与map控件联系起来 pMapDocument.Open(strFileName, );/strFileName是用户选择的文档文件 for (int i = 0; i pMapDocument.MapCount; i+) /遍历所有可能的Map对象 axMapControl1.Map = pMapDocument.get_Map(i); /刷新地图 axMapControl1.Refresh();/保存文档文件 /判断文档是否为只读文档 if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename) = true) MessageBox.Show(此地图文档为只读文档!, 信息提示); return; /用相对路径保存地图文档 pMapDocument.Save(pMapDocument.UsesRelativePaths, true); MessageBox.Show(保存成功!, 信息提示);/文档文件另存 if (strFilePath = pMapDocument.DocumentFilename)/strFilePath是用户输入的需要保存的文档/文件的名称 /将修改后的地图文档保存在原文件中 SaveDocument(axMapControl1); else /将修改后的地图文档保存为新文件 pMapDocument.SaveAs(strFilePath, true, true); MessageBox.Show(保存成功!, 信息提示); 下面编写一个类,用于封装打开矢量格式(*.Shp)、栅格格式和文档格式(*.mxd)等类型的地理数据。也封装了新建、打开、保存和另存地图文档的方法,取类名为GeoMapAdd。using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;/添加ArcGIS命名空间using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Output;using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.DataSourcesFile;using ESRI.ArcGIS.DataSourcesRaster;using ESRI.ArcGIS.Geodatabase;namespace AppGIS1/命名空间名由项目名缺省生成 class GeoMapLoad/类名 public static IMapDocument pMapDocument;/定义地图文档接口变量 /定义加载各种地理数据的静态方法 public static void LoadGeoData(AxMapControl axMapControl1,AxMapControl axMapControl2,string strFileN) string strFExtenN = System.IO.Path.GetExtension(strFileN);/获取文件扩展名 switch (strFExtenN) case .shp: /用户选择了*.shp格式文件 string strPath = System.IO.Path.GetDirectoryName(strFileN);/获取文件路径 string strFile = System.IO.Path.GetFileNameWithoutExtension(strFileN);/获取没有扩展名的名剑名 /向地图控件中加载地图 axMapControl1.AddShapeFile(strPath, strFile); /对鸟瞰图进行控制 axMapControl2.ClearLayers(); axMapControl2.AddShapeFile(strPath, strFile); axMapControl2.Extent = axMapControl2.FullExtent;/进行全图显示 break; case .bmp: case .tif: case .jpg: case .img: IRasterLayer pRasterLayer; pRasterLayer = new RasterLayerClass(); string pathName = System.IO.Path.GetDirectoryName(strFileN); string fileName = System.IO.Path.GetFileName(strFileN); IRasterWorkspace pRWS; IWorkspaceFactory pWSF; IRaster pRaster; IRasterDataset pRasterDataset; IWorkspace pWS; pWSF = new RasterWorkspaceFactoryClass(); pWS = pWSF.OpenFromFile(pathName, 0); pRWS = pWS as IRasterWorkspace;/QI pRasterDataset = pRWS.OpenRasterDataset(fileName); /影像金字塔判断与创建 IRasterPyramid pRasPyrmid; pRasPyrmid = pRasterDataset as IRasterPyramid; if (pRasPyrmid != null) if (!(pRasPyrmid.Present) pRasPyrmid.Create(); /在进度条中说明正在创建金字塔 pRaster = pRasterDataset.CreateDefaultRaster(); pRasterLayer.CreateFromRaster(pRaster); ILayer pLayer = pRasterLayer as ILayer; /向主控视图中添加图像 axMapControl1.AddLayer(pLayer, 0); /确定是否加入空间参考 axMapControl2.ClearLayers(); /向鹰眼视图中添加图像 axMapControl2.AddLayer(pLayer, 0); axMapControl2.Extent = axMapControl2.FullExtent; break; case .mxd: if(axMapControl1.CheckMxFile(strFExtenN) axMapControl1.LoadMxFile(strFExtenN); else MessageBox.Show(所选择的文件不是Mxd文档文件!,信息提示); break; default: break; /对文档地图的若干操作 public static void OperateMapDoc(AxMapControl axMapControl1, AxMapControl axMapControl2, string strOperateType) /定义打开文件对话框 OpenFileDialog OpenFileDlg = new OpenFileDialog(); /定义保存文件对话框 SaveFileDialog SaveFileDlg = new SaveFileDialog(); OpenFileDlg.Filter = 地图文档文件(*.mxd)|*.mxd; SaveFileDlg.Filter = 地图文档文件(*.mxd)|*.mxd; string strDocFileN = string.Empty; pMapDocument = new MapDocumentClass(); /判断操作文档地图的类型 switch (strOperateType) case NewDoc: SaveFileDlg.Title = 输入需要新建地图文档的名称; SaveFileDlg.ShowDialog(); strDocFileN = SaveFileDlg.FileName; if (strDocFileN = string.Empty) return; pMapDocument.New(strDocFileN); pMapDocument.Open(strDocFileN, ); axMapControl1.Map = pMapDocument.get_Map(0); break; case OpenDoc: OpenFileDlg.Title = 选择需要加载的地图文档文件; OpenFileDlg.ShowDialog(); strDocFileN = OpenFileDlg.FileName; if (strDocFileN = string.Empty) return; /将数据加载入pMapDocument并与map控件联系起来 pMapDocument.Open(strDocFileN, ); for (int i = 0; i pMapDocument.MapCount; i+) /遍历可能的Map对象 axMapControl1.Map = pMapDocument.get_Map(i); /axMapControl2.Map = pMapDocument.get_Map(i); /刷新地图 axMapControl1.Refresh(); break; case SaveDoc: /判断文档是否为只读文档 if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename) = true) MessageBox.Show(此地图文档为只读文档!, 信息提示); return; /用相对路径保存地图文档 pMapDocument.Save(pMapDocument.UsesRelativePaths, true); MessageBox.Show(保存成功!, 信息提示); break; case SaveDocAs: SaveFileDlg.Title = 地图文档另存; SaveFileDlg.ShowDialog(); strDocFileN = SaveFileDlg.FileName; if (strDocFileN = string.Empty) return; if (strDocFileN = pMapDocument.DocumentFilename) /将修改后的地图文档保存在原文件中 /用相对路径保存地图文档 pMapDocument.Save(pMapDocument.UsesRelativePaths, true); MessageBox.Show(保存成功!, 信息提示); break; else /将修改后的地图文档保存为新文件 pMapDocument.SaveAs(strDocFileN, true, true); MessageBox.Show(保存成功!, 信息提示); break; default: break; 2.1.3 鼠标与控件的交互用鼠标与地图控件进行交互是最常用的操作,例如改变地图显示范围、移动地图、在控件上绘制几何图形等。使用AE控件实现上述操作,用户不用进行复杂的坐标转换工作,可以直接使用控件产生的事件和鼠标在控件上产生的点对象。用鼠标拖曳确定地图显示范围 通过在MapControl控件的MouseDown事件中添加下列代码,当用户在控件上拖曳一个矩形框后,地图视图的显示范围就变为拖曳的矩形区域范围。/改变鼠标样式 axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair; /将地图控件显示范围设置为当前拖曳的矩形区域 axMapControl1.Extent = axMapControl1.TrackRectangle(); /刷新地图axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);移动地图 在MapControl中可以利用pan()方法来移动其中的地图。在MapControl控件的OnMouseDown事件中,添加如下代码,可实现地图移动。 axMapControl1.Pan();在MapControl控件中绘制图形绘制图形包括绘制点、线、面和标注等。下面举例说明绘制点、线、面图形和标注的方法,别的图形的绘制将在后续章节中介绍。(1)绘制点 IMap pMap; IActiveView pActiveView; pMap = axMapControl1.Map; pActiveView = pMap as IActiveView; /新建点对象 IPoint pPt; pPt = new PointClass(); pPt.PutCoords(e.mapX, e.mapY); /产生一个Marker元素 IMarkerElement pMarkerElement; pMarkerElement = new MarkerElementClass(); /产生修饰Marker元素的symbol ISimpleMarkerSymbol pMarkerSymbol; pMarkerSymbol = new SimpleMarkerSymbolClass(); /设置符号颜色 IRgbColor pColor; pColor = new RgbColorClass(); pColor.Red = 220; pColor.Green = 112; pColor.Blue = 60; pMarkerSymbol.Color = pColor;/需要由用户动态设定 /设置符号大小 pMarkerSymbol.Size = 2; /设置符号类型 pMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;/点符号也应该由用户动态选择 IEle

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论