1、添加程序集

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;

*若出现“命名空间ESRI.ArcGIS中不存在类型或命名空间”的错误

解决方法如下:
右击解决方案中的引用,打开添加引用

选择缺少的程序集,点击确定

2、添加定义声明变量,添加SynchronizeEagleEye方法、DrawRectangle方法、GetRgbColor方法代码

 //定义声明变量IEnvelope pEnv;
private void SynchronizeEagleEye()
{if (EagleEyeMapControl.LayerCount > 0){EagleEyeMapControl.ClearLayers();}//设置鹰眼和主地图的坐标系统一致EagleEyeMapControl.SpatialReference = mainMapControl.SpatialReference;for (int i = mainMapControl.LayerCount - 1; i >= 0; i--){//使鹰眼视图与数据视图的图层上下顺序保持一致ILayer pLayer = mainMapControl.get_Layer(i);if (pLayer is IGroupLayer || pLayer is ICompositeLayer){ICompositeLayer pCompositeLayer = (ICompositeLayer)pLayer;for (int j = pCompositeLayer.Count - 1; j >= 0; j--){ILayer pSubLayer = pCompositeLayer.get_Layer(j);IFeatureLayer pFeatureLayer = pSubLayer as IFeatureLayer;if (pFeatureLayer != null){//由于鹰眼地图较小,所以过滤点图层不添加if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint&& pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint){EagleEyeMapControl.AddLayer(pLayer);}}}}else{IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;if (pFeatureLayer != null){if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint&& pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint){EagleEyeMapControl.AddLayer(pLayer);}}}//设置鹰眼地图全图显示  EagleEyeMapControl.Extent = mainMapControl.FullExtent;pEnv = mainMapControl.Extent as IEnvelope;DrawRectangle(pEnv);EagleEyeMapControl.ActiveView.Refresh();}
}
//在鹰眼地图上面画矩形框
private void DrawRectangle(IEnvelope pEnvelope)
{//在绘制前,清除鹰眼中之前绘制的矩形框IGraphicsContainer pGraphicsContainer = EagleEyeMapControl.Map as IGraphicsContainer;IActiveView pActiveView = pGraphicsContainer as IActiveView;pGraphicsContainer.DeleteAllElements();//得到当前视图范围IRectangleElement pRectangleElement = new RectangleElementClass();IElement pElement = pRectangleElement as IElement;pElement.Geometry = pEnvelope;//设置矩形框(实质为中间透明度面)IRgbColor pColor = new RgbColorClass();pColor = GetRgbColor(255, 0, 0);pColor.Transparency = 255;ILineSymbol pOutLine = new SimpleLineSymbolClass();pOutLine.Width = 2;pOutLine.Color = pColor;IFillSymbol pFillSymbol = new SimpleFillSymbolClass();pColor = new RgbColorClass();pColor.Transparency = 0;pFillSymbol.Color = pColor;pFillSymbol.Outline = pOutLine;//向鹰眼中添加矩形框IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;pFillShapeElement.Symbol = pFillSymbol;pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);//刷新pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
//定义用于获取颜色的GetRgbColor方法
private IRgbColor GetRgbColor(int intR, int intG, int intB)
{IRgbColor pRgbColor = null;if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255){return pRgbColor;}pRgbColor = new RgbColorClass();pRgbColor.Red = intR;pRgbColor.Green = intG;pRgbColor.Blue = intB;return pRgbColor;
}

*出现“无法嵌入互操作类型”的错误

解决方法如下:
修改相应程序集的“嵌入互操作类型”属性值,将原来的True改为False

3、设置MainMapControl控件的OnMapReplaced属性的功能,在OnMapReplaced中添加SynchronizeEagleEye方法

private void MainMapControl_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e){SynchronizeEagleEye();}

4、设置MainMapControl控件的OnExtentUpdated属性的功能,在OnExtentUpdated中添加DrawRectangle方法

private void MainMapControl_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e){//得到当前视图范围pEnv = (IEnvelope)e.newEnvelope;DrawRectangle(pEnv);}

5、设置EagleEyeMapControl控件的OnMouseDown属性的功能,添加OnMouseDown的左键和右键功能代码

 //定义声明变量IPoint pMoveRectPoint;bool bCanDrag;
private void EagleEyeMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{if (EagleEyeMapControl.Map.LayerCount > 0){//按下鼠标左键移动矩形框if (e.button == 1){//如果指针落在鹰眼的矩形框中,标记可移动if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax){bCanDrag = true;}pMoveRectPoint = new PointClass();pMoveRectPoint.PutCoords(e.mapX, e.mapY);  //记录点击的第一个点的坐标}//按下鼠标右键绘制矩形框else if (e.button == 2){IEnvelope pEnvelope = EagleEyeMapControl.TrackRectangle();IPoint pTempPoint = new PointClass();pTempPoint.PutCoords(pEnvelope.XMin + pEnvelope.Width / 2, pEnvelope.YMin + pEnvelope.Height / 2);mainMapControl.Extent = pEnvelope;//矩形框的高宽和数据试图的高宽不一定成正比,这里做一个中心调整mainMapControl.CenterAt(pTempPoint);}}
}

6、设置EagleEyeMapControl控件的OnMouseMove属性的功能,添加OnMouseMove改变鼠标样式的功能代码

private void EagleEyeMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax){//如果鼠标移动到矩形框中,鼠标换成小手,表示可以拖动EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerHand;if (e.button == 2)  //如果在内部按下鼠标右键,将鼠标演示设置为默认样式{EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;}}else{//在其他位置将鼠标设为默认的样式EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;}if (bCanDrag){double Dx, Dy;  //记录鼠标移动的距离Dx = e.mapX - pMoveRectPoint.X;Dy = e.mapY - pMoveRectPoint.Y;pEnv.Offset(Dx, Dy); //根据偏移量更改 pEnv 位置pMoveRectPoint.PutCoords(e.mapX, e.mapY);DrawRectangle(pEnv);mainMapControl.Extent = pEnv;}
}

7、设置EagleEyeMapControl控件的OnMouseUp属性的功能,添加OnMouseUp范围变化的功能代码

private void EagleEyeMapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{if (e.button == 1 && pMoveRectPoint != null){if (e.mapX == pMoveRectPoint.X && e.mapY == pMoveRectPoint.Y){mainMapControl.CenterAt(pMoveRectPoint);}bCanDrag = false;}
}

8、设置MainMapControl控件的OnAfterScreenDraw属性的功能,添加OnAfterScreenDraw的功能代码及CopyToPageLayout代码

private void CopyToPageLayout()
{IObjectCopy pObjectCopy = new ObjectCopyClass();object copyFromMap = mainMapControl.Map;object copiedMap = pObjectCopy.Copy(copyFromMap);//复制地图到copiedMap中object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;pObjectCopy.Overwrite(copiedMap, ref copyToMap); //复制地图axPageLayoutControl1.ActiveView.Refresh();
}
private void mainMapControl_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
{IActiveView pActiveView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;displayTransformation.VisibleBounds = mainMapControl.Extent;axPageLayoutControl1.ActiveView.Refresh();CopyToPageLayout();
}

9、鹰眼成果展示
鼠标移动鹰眼视图内变成手指样式;可在鹰眼视图内左键拖动矩形框、右键画矩形框来改变显示区域

【ArcGIS二次开发】鹰眼的实现相关推荐

  1. arcgis二次开发python-ArcGIS 二次开发专题 序

    依据ArcGIS 组件式开发及应用的目录结构,将系统性的学习ArcGIS 二次开发的道路分为三个部分.这个系列包含以下三个部分: Part1 基础 1. 前言 1.1 组件式GIS 1.2 ArcOb ...

  2. ArcGIS二次开发入门 一

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 作者:朱 ...

  3. ArcGis二次开发ArcEngine开篇

    ArcGis二次开发ArcEngine开篇 以一款简单GIS软件截图片引入本篇内容 导读 万事开头难,如何利用ArcEngine开发一款GIS产品呢?一款简单的GIS软件基本布局如上图所示,共划分为六 ...

  4. 基于ARCGIS二次开发可视化开发环境搭建(JAVA)

    这两天为了搭建这么一个基于java的ArcGIS二次开发环境可着实花了一番心血.在网上搜索各种资料,大部分都是基于C#的,关于JAVA的很少,而且很杂乱,没有一个完整的.详细的.适合新手的这么一个教程 ...

  5. ArcGIS二次开发基础教程(11):网络分析之最短路径分析

    ArcGIS二次开发基础教程(11):网络分析之最短路径分析 最短路径分析 这里直接调用了在mdb中建立好的网络数据集 //全局变量 private INetworkDataset my_networ ...

  6. Arcgis 二次开发指导 热点分析实现

    Arcgis 二次开发 热点分析 背景 具体操作 1.toolbox试验 2.查找接口 3.输入文件路径,特别注意! 4.找出错误原因 总结 背景 大三下上完了arcgis二次开发,真心觉得咱们gis ...

  7. ArcGIS二次开发基础教程(10):三维分析

    ArcGIS二次开发基础教程(10):三维分析 坡度分析 请务必学会使用帮助文档!!! //DEM数据的坡度分析 将分析结果添加到地图上 //首先获取DEM数据,方法有很多例如从个人地理数据库获取,也 ...

  8. ArcGIS二次开发入门(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 公司培训ArcGIS二次开发(C#作为开发语言),自己回家动手实践了一下. 1. 首先是二次开发环境的安装(AE 10 ...

  9. ArcGIS二次开发基础教程(06):有关图层的基本操作

    ArcGIS二次开发基础教程(06):有关图层的基本操作 0. PageLayout和MapControl 的同步 void CopyToPage(){//对象拷贝,把mapcontrol的地图拷贝重 ...

  10. ArcGIS二次开发基础教程(13):网络分析之最近设施分析

    ArcGIS二次开发基础教程(13):网络分析之最近设施分析 最近设施分析 /// <summary>/// Geodatabase function: open work space// ...

最新文章

  1. 【带你玩转主题模型Topic Model】—— 之 利用sklearn 实现Latetnt Dirichlet Allocation(LDA)主题模型
  2. python wsdl connection refused 111
  3. BZOJ 3101: N皇后 构造
  4. 用OpenJTAG烧写程序到Flash—— 韦东山嵌入式Linux视频学习笔记03
  5. 线段树空间容纳且最上边的数(单点更新)
  6. 浏览器崩溃_如何在浏览器不崩溃的情况下过滤200万行数据?
  7. axios.post提交的三种请求方式
  8. 【faebdc的模拟赛】T2分组
  9. WPF ListView中自动生成的列
  10. 高校计算机实验室管理制度,高校计算机实验室管理论文
  11. MongoDB实战经验分享
  12. VLAN与Trunk的配置
  13. java导出excel 图片_请教java导出多张图片到Excel问题!
  14. matlab中nnt,Matlab语言的Neural Network Toolbox 及其在同步中
  15. Vue - 加载静态图片的方式
  16. 5G/NR 标识详解之5G-GUTI
  17. python3*1**3 表达式输出结果为_3*1**3 表达式输出结果为________
  18. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
  19. cmd窗口输入python跳转到微软商店
  20. LTspice基础教程-022.从MOS管提取参数生成spice模型

热门文章

  1. 全基因组重测序揭示了野生大豆的局部适应和分化的特征
  2. 问题解决:pvcreate过程中错误Device /dev/sdb not found (or ignored by filtering)
  3. FilterChain的详解
  4. ps 2023(24.7beta) mac
  5. 【致敬嵌入式攻城狮第2期活动预热征文】蜂鸣器加流水灯按键检测的实现
  6. #杜甫诗作的主要内容#
  7. cacti 无法生成rrt poller.php,cacti无法显示图片,图片显红叉
  8. Win7关闭休眠方法
  9. 什么是混淆矩阵精度、召回率、准确性、F1 分数、FPR、FNR、TPR、TNR?
  10. SQL中的空值、NULL以及类型转换那些坑