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 文件添加图层到地图控件1
axMapControl1.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) // 拾取点
{
// 创建一个新的点对象 pt
IPoint pt = new PointClass();
// 将事件处理程序形参 e 中的鼠标点击坐标赋值给 pt 的 X 和 Y 属性
pt.X = e.x;
pt.Y = e.y;
// 将地图控件的中心点设置为被点击的点 pt
axMapControl1.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);
感谢各位支持
如需需要后续笔记,请私信作者,谢谢。