1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > ArcGIS Engine二次开发(三)

ArcGIS Engine二次开发(三)

时间:2018-08-07 14:31:30

相关推荐

ArcGIS Engine二次开发(三)

3.ArcGIS Engine控件编程

*本章有一个鹰眼控件的实现,可以查看相关文件

3.1 AE控件概述

控件所在命名空间:ESRI.ArcGIS.Controls

为了简化程序设计人员的二次开发﹐AE提供了一组控件﹐用于快速搭建GIS应用程序。

制图控件:MapControl和PageLayoutControl

3D控件:SceneControl和GlobeControl

框架控件:TOCControl和ToolbarControl

符号库管理控件:SymbologyControl

许可管理控件:LicenseControl

3.2 MapControl控件

所在的库: MapControl.ocx

该控件用于对空间数据进行分析和浏览,它封装了Map类(coclass),暴露了鼠标和绘制事件,支持地图文档(*.mxd)的装载。

实现了IMapControl2、IMapControl3、IMapControl4、 ITOCBuddy、IToolbarBuddy 、IMapControlEvents2、 ITOCBuddyEvents等接口

其中IMapControl2为主要接口,其余3、4是补充部分,2、3、4同时被写入IMapControlDefault接口中调用IMapControlDefault接口等于调用了2、3、4接口

IMapControl2

主要属性:ActiveView、Extent、FullExtent、Map、Layer、LayerCount

ActiveView:获取或设置当前地图的活动视图的属性。活动视图是指当前正在显示的地图视图或图层。

Extent:描述了地图显示的范围。该属性是一个只读属性,也就是说,它只能获取当前地图显示的范围,而不能更改地图的显示范围。

FullExtent:指地图控件中地图的完整显示范围。FullExtent属性是一个只读属性,它可以帮助开发人员在需要时获取当前地图的完整显示范围。

Map:指地图控件中的地图对象,主要用于控制和操作地图的各种属性和方法。Map属性是一个可读/可写的属性,可以允许开发人员访问和控制地图对象的各种属性和方法。

Layer:指当前地图控件中的图层对象。Layer属性是一个只读属性,它可以帮助开发人员在需要时获取当前地图控件中的所有图层。

LayerCount:用于获取地图控件中的图层数量。

主要方法:AddLayer、AddLayerFromFile、AddShapeFileDeleteLayer、ClearLayers、MoveLayerTo、CenterAt、Pan、CheckMxFile、LoadMxFile、ReadMxMaps、DrawShape、DrawText、FlashShape、RefreshFrom、MapPoint、ToMapPoint、TrackCircle、TrackLine、TrackPolygon、TrackRectangle

AddLayer:向地图控件中添加新的图层。

AddLayerFromFile:向地图控件中添加一个指定路径的新图层。

AddShapeFileDeleteLayer:向地图控件中添加Shapefile图层,并在需要时删除其他指定的图层。

ClearLayers:从地图控件中移除所有的图层。

MoveLayerTo:用于将地图上的图层移动到指定的位置。

CenterAt:将地图控件中心点设置为指定的地图坐标。

Pan:在地图控件中按照指定的水平和垂直偏移量进行平移。

ChecjMxFile:用于验证指定的mx文件是否可以正确加载。

LoadMxFile:用于加载指定路径的MXD文件。

ReadMxMaps:用于获取指定路径的MXD文件中包含的所有地图。

DrawShape:用于在地图控件上绘制指定的几何图形。

DrawText:用于在地图控件上绘制指定的文本。

FlashShape:用于在地图控件上闪烁指定的几何图形。

RefreshFrom:用于刷新指定图层的地图控件。

MapPoint:使用MapPoint可以在地图上定位点,并执行一系列地理空间分析操作。

ToMapPoint:可以将在地图控件上的像素坐标转换为地图坐标,返回一个IPoint对象。

TrackCircle:是一个自定义的操作(operation),可以使用ArcObjects实现在地图控件上跟踪一个圆形

TrackLine:使用ArcObjects实现在地图控件上跟踪一条线段。

TrackPolygon:可以使用ArcObjects实现在地图控件上跟踪一个多边形。

TrackRectangle:可以使用ArcObjects实现在地图控件上跟踪一个矩形。

IMapControl3 IMapControl4

IMapControl3继承自IMapControl2;IMapControl4继承自IMapControl3

新增重要属性:DocumentFilename、DocumentMap

IMapControlEvent2

主要事件:OnAfterDraw(OnAfterScreenDraw、OnBeforeScreenDraw、OnExtentUpdated、OnFullExtentUpdated、OnMapReplaced、OnKeyDown、OnKeyUp、OnDoubleClick(OnMouseDown、OnMouseMove、OnMouseUp)

OnAfterDraw:在地图控件上绘制完成后触发此事件。 OnAfterScreenDraw:在地图控件的屏幕上完成绘制后触发此事件。OnBeforeScreenDraw:在地图控件的屏幕上进行绘制之前触发此事件。OnExtentUpdated:在地图控件的地图范围更新后触发此事件。OnFullExtentUpdated:在地图控件的全局地图范围更新后触发此事件。OnMapReplaced:当新地图替换当前地图时触发此事件。OnKeyDown:当用户按下某个按键时触发此事件。OnKeyUp:当用户释放按下的按键时触发此事件。OnDoubleClick:在地图控件上双击鼠标时触发此事件。OnMouseDown:在鼠标在地图控件内按下时触发此事件。OnMouseMove:鼠标在地图控件内移动时触发此事件。OnMouseUp:在鼠标在地图控件内抬起时触发此事件。

事件的使用方式

axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){//添加事件处理代码。。。}

MapControl使用实例

1.使用地图控件,并设置地图数据:

2.属性的使用

Extent、FullExtent

private void button1_Click(object sender, EventArgs e){// 获取地图控件当前的范围IEnvelope mExtent = axMapControl1.Extent;// 在x和y方向上将范围按0.5倍进行扩展// 第三个参数 'true' 表示新的范围完全包含旧的范围mExtent.Expand(0.5, 0.5, true);// 将地图控件的范围设置为扩展后的范围,最终结果是放大了axMapControl1.Extent = mExtent;}private void button2_Click(object sender, EventArgs e){// 获取地图控件当前的范围IEnvelope mExtent = axMapControl1.Extent;// 在x和y方向上将范围按2倍进行扩展// 第三个参数 'true' 表示新的范围完全包含旧的范围mExtent.Expand(2, 2, true);// 将地图控件的范围设置为扩展后的范围axMapControl1.Extent = mExtent;}

快速让当前地图全幅显示

axMapControl1.Extent = axMapControl1.FullExtent;

LayerCount、 Layer

private void button3_Click(object sender, EventArgs e){// 获取当前地图控件中主地图图层的数量,并显示在消息框中MessageBox.Show("当前主地图图层数量为: " + axMapControl1.LayerCount.ToString());}private void button4_Click(object sender, EventArgs e){// 获取地图控件1中索引为2的图层ILayer lyr = axMapControl1.get_Layer(2);// 将该图层添加到地图控件2中axMapControl2.AddLayer(lyr);// 刷新地图控件2,以显示新添加的图层axMapControl2.Refresh();}

axMapControl1. Layer(i) VS get_Layer(i) 有什么区别???

方法的使用

AddLayerFromFile、ClearLayers

private void button6_Click(object sender, EventArgs e){// 获取应用程序路径string appPath = Environment.CurrentDirectory + "\\World";// 从 shapefile 添加图层到地图控件1(被注释的代码)// axMapControl1.AddShapeFile(appPath, "world30.shp");// 从 lyr 文件添加图层到地图控件1axMapControl1.AddLayerFromFile(appPath + "\\Continents.lyr");}private void button5_Click(object sender, EventArgs e){// 将地图控件1转换为 IMapControl2 接口类型IMapControl2 iMapControl = axMapControl1.Object as IMapControl2;// 清除地图控件1中所有的图层iMapControl.ClearLayers();}

TrackLine、TrackPolygon

IGeometry geometry; // 接口变量private void button8_Click(object sender, EventArgs e){// 将地图控件1转换为 IMapControl2 接口类型IMapControl2 iMapControl = axMapControl1.Object as IMapControl2;// 调用 TrackLine() 方法进行曲线绘制,并将结果保存在 geometry 变量中geometry = iMapControl.TrackLine();// 将 geometry 转换为 IPolyline 接口类型IPolyline ply = geometry as IPolyline;// 显示绘制的曲线长度MessageBox.Show("绘制的曲线长度为: " + ply.Length.ToString() + iMapControl.MapUnits.ToString());}private void button9_Click(object sender, EventArgs e){// 使用 TrackPolygon() 方法进行多边形绘制,并将结果保存在 geometry 变量中geometry = axMapControl1.TrackPolygon();// 将 geometry 转换为 IPolygon 接口类型IPolygon polygon = geometry as IPolygon;}

DrawShape、DrawText

IGeometry geometry; // 接口变量private void button10_Click(object sender, EventArgs e){// 检查 geometry 是否为空if (geometry != null){// 在地图控件上绘制几何对象axMapControl1.DrawShape(geometry);}else{// 提示用户先绘制几何对象MessageBox.Show("请先绘制几何对象!");}// 创建一个点对象IPoint pt = new PointClass();// 获取地图控件的显示范围IEnvelope ev = axMapControl1.Extent;// 计算中心点坐标pt.X = (ev.XMax + ev.XMin) / 2;pt.Y = (ev.YMax + ev.YMin) / 2;// 在地图控件上绘制文本axMapControl1.DrawText(pt as IGeometry, "Hello World!");}

事件的使用

uint nflag; //用于记录鼠标动作类型:0、拾取点;1、绘制多边形//定位地图中心点private void button7_Click(object sender, EventArgs e){nflag = 0; //指示鼠标动作为拾取点}//修正后的交互式绘制多边形private void button11_Click(object sender, EventArgs e){nflag = 1; //指示鼠标动作为拾取点}

private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){// 根据 nflag 的值执行相应的操作if (nflag == 0) // 拾取点{// 创建一个新的点对象 ptIPoint pt = new PointClass();// 将事件处理程序形参 e 中的鼠标点击坐标赋值给 pt 的 X 和 Y 属性pt.X = e.x;pt.Y = e.y;// 将地图控件的中心点设置为被点击的点 ptaxMapControl1.CenterAt(pt);}else if (nflag == 1) // 绘制多边形{// 使用 axMapControl1.TrackPolygon() 方法跟踪绘制多边形的过程,并将结果保存在 geometry 变量中geometry = axMapControl1.TrackPolygon();// 检查 geometry 是否为空if (geometry != null){// 闪烁显示绘制的多边形axMapControl1.FlashShape(geometry);// 在地图控件上绘制多边形axMapControl1.DrawShape(geometry);}}}

3.3 TOCControl控件

该控件与地图和布局空间绑定,实现地图内容目录的展示。

TOCControl控件介绍

使用TOCControl控件

控件的操作可以通过工具栏或属性实现,具体实现请百度

1.设置TOC关联的地图或布局

设计期间的绑定设置,也可用代码在运行期间动态设置:

public Form1(){// 构造函数,在窗体初始化时执行InitializeComponent();// 使用 axTOCControl1.SetBuddyControl() 方法将 axMapControl1 绑定到 axTOCControl1 控件上axTOCControl1.SetBuddyControl(axMapControl1.Object);}

实现地图与TOCControl控件联动

添一下以下事件处理程序:

private void axMapControl1_OnAfterDraw(object sender, IMapControlEvents2_OnAfterDrawEvent e){// 地图绘制完成后触发的事件处理程序// 调用 axTOCControl1.Update() 方法刷新整个控件axTOCControl1.Update();}

3. 获取TOCControl中选中项基本信息

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e){// 目录控件鼠标按下事件处理程序// 定义变量并初始化esriTOCControlItem selItem = esriTOCControlItem.esriTOCControlItemNone; // 选中的目录项类型IBasicMap bMap = null; // 基础地图对象ILayer lyr = null; // 图层对象object obj = null; // 特定目录项的对象引用// 使用 axTOCControl1.HitTest() 方法进行目录项的命中测试axTOCControl1.HitTest(e.x, e.y, ref selItem, ref bMap, ref lyr, ref obj, ref obj);}

3.4 ToolBarControl控件

该控件与地图和布局空间绑定,实现地图的控制与操作展示。

ToolBarControl控件介绍

使用ToolBarControl控制

//第一种方法// 创建一个 UID 对象,并设置其值为 "esriControlCommands.ControlsMapFullExtentCommand"UID uID = new UIDClass();uID.Value = "esriControlCommands.ControlsMapFullExtentCommand";// 使用 axToolbarControl1.AddItem() 方法将命令添加到工具栏控件中// 参数依次为:命令的 UID 对象、按钮索引(-1 表示将按钮添加到末尾)、组合索引(-1 表示不分组)、是否可见、指定按钮索引之前的按钮移动的距离、命令样式axToolbarControl1.AddItem(uID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);//第二种方法// 创建 ControlsMapFullExtentCommandClass 的实例作为 ICommand 对象ICommand command = new ControlsMapFullExtentCommandClass();// 使用 axToolbarControl1.AddItem() 方法将命令添加到工具栏控件中// 参数同样依次为:命令对象、按钮索引、组合索引、是否可见、指定按钮索引之前的按钮移动的距离、命令样式axToolbarControl1.AddItem(command, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

感谢各位支持

如需需要后续笔记,请私信作者,谢谢。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。