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接口

image-20230506214819892

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.使用地图控件,并设置地图数据:

image-20230506215829041

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;
}


image-20230506215941268

快速让当前地图全幅显示

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控件介绍

image-20230506220834114

使用TOCControl控件

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

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

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

public Form1()
{
     // 构造函数,在窗体初始化时执行

     InitializeComponent();

     // 使用 axTOCControl1.SetBuddyControl() 方法将 axMapControl1 绑定到 axTOCControl1 控件上
     axTOCControl1.SetBuddyControl(axMapControl1.Object);
}


  1. 实现地图与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控件介绍

image-20230506221539556

image-20230506221547607

使用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);

感谢各位支持
如需需要后续笔记,请私信作者,谢谢。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲墨知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值