ae的官方类库没有提供该控件,需要自己实现,不过也比较简单,原理或实现的思路是,另外增加一个axMapControl控件,把他的视图设为地图的全图范围,把当前地图的范围,在这个地图控件上用红色框画出来即可。

首先新建一个用户控件,名称设为MapEagle,在控件上拖拽一个axmapcontrol控件,名称设为axMapEagle ,用来显示地图。

接下来,增加一个自定义属性,用来和地图主窗口关联,使得axMapEagle 能获得当前地图的范围

   1:  private AxMapControl pMap;
   2:          
   3:          /// <summary>
   4:          /// 关联的地图控件
   5:          /// </summary>
   6:          public AxMapControl MapControl
   7:          {
   8:              set
   9:              {
  10:                  if (value != pMap) pMap = value;
  11:                  //this.axMapEagle.Extent = pMap.FullExtent;
  12:                  pMap.OnMapReplaced += new IMapControlEvents2_Ax_OnMapReplacedEventHandler(pMap_OnMapReplaced);
  13:                  pMap.OnExtentUpdated += new IMapControlEvents2_Ax_OnExtentUpdatedEventHandler(pMap_OnExtentUpdated);
  14:              }
  15:   
  16:          }

主地图控件的OnMapReplaced事件,使得当主地图窗口重新加载时,刷新axMapEagle 的视图范围,实现代码如下

   1:    void pMap_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
   2:          {
   3:   
   4:              for (int i = 0; i <= pMap.LayerCount; i++)
   5:              {
   6:                  axMapEagle.AddLayer(pMap.get_Layer(i));
   7:              }
   8:              this.axMapEagle.Extent = pMap.FullExtent;
   9:   
  10:              IGraphicsContainer pGraphicsContainer = this.axMapEagle.Map as IGraphicsContainer;
  11:              IActiveView pActiveView = pGraphicsContainer as IActiveView;
  12:              pGraphicsContainer.DeleteAllElements();
  13:   
  14:              IElement pEle = Envelope2Element(pMap.Extent);
  15:              pGraphicsContainer.AddElement(pEle, 0);
  16:              pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
  17:          }

该事件中,首先将主地图的图层都加载到axMapEagle 控件中,然后将试图设为全图,接下来删除窗口中的所有Element,再往后就是把主地图的视图范围,在axMapEagle 的视图上画出来,采用创建element的方法实现,方法Envelope2Element 实现将视图范围IEnvelope转化为一个element,把axMapEagle的地图设为图形容器,把创建好的element加进去,然后刷新视图即可。

方法Envelope2Element 的实现过程,如下所示

   1:   private IElement Envelope2Element(IEnvelope env)
   2:          {
   3:              IRectangleElement pRectangleEle = new RectangleElementClass();
   4:              IElement pEle = pRectangleEle as IElement;
   5:              pEle.Geometry = env;
   6:   
   7:              IRgbColor pColor = new RgbColorClass();
   8:              pColor.RGB = 255;
   9:              pColor.Transparency = 255;
  10:   
  11:              ILineSymbol pOutline = new SimpleLineSymbolClass();
  12:              pOutline.Width = 1.5;
  13:              pOutline.Color = pColor;
  14:   
  15:              pColor = new RgbColorClass();
  16:              pColor.RGB = 255;
  17:              pColor.Transparency = 0;
  18:   
  19:              IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
  20:              pFillSymbol.Color = pColor;
  21:              pFillSymbol.Outline = pOutline;
  22:   
  23:              IFillShapeElement pFillshapeEle = pEle as IFillShapeElement;
  24:              pFillshapeEle.Symbol = pFillSymbol;
  25:              return  pFillshapeEle as IElement;
  26:          }

到这里已经实现一半了,剩下当主地图视图放大或缩小后,鹰眼地图上的范围标示随之变化没有实现了。也就是主地图的OnExtentUpdated方法,它的官方说明是这样 “Fires after the extent (visible bounds) of the MapControl is changed.”当地图控件的可视范围变化后触发,正是我们想要的。它的实现和加载时一样,同样将变化后的视图范围在地图上绘制就可以了,不用重新加载地图,具体代码如下

   1:          void pMap_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
   2:          {
                   //删除已添加的Element
   3:              IGraphicsContainer pGraphicsContainer = this.axMapEagle.Map as IGraphicsContainer;
   4:              IActiveView pActiveView = pGraphicsContainer as IActiveView;
   5:              pGraphicsContainer.DeleteAllElements();
   6:   
   7:              IElement pEle = Envelope2Element(e.newEnvelope as IEnvelope );
   8:              pGraphicsContainer.AddElement(pEle, 0);
   9:              pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
  10:          }
工作已经完成90%了,呵呵,axMapEagle 控件都会适应主地图视图的变化,还缺的就是主地图视图要适应axMapEagle的视图变化。
即,当在鹰眼视图上点击时,主地图也要能够移动到点击的位置,这样才是真正的方便。要实现这样的功能,就要用到地图控件
的OnMouseDown事件,代码如下
   1:  private void axMapEagle_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
   2:          {
   3:              IRubberBand pBand = new RubberEnvelopeClass();
   4:              IGeometry pGeometry = pBand.TrackNew(axMapEagle.ActiveView.ScreenDisplay, null);
   5:            
   6:              if (pGeometry.IsEmpty)
   7:              {
   8:                  IPoint pPt = new PointClass();
   9:                  pPt.PutCoords(e.mapX, e.mapY);
  10:                  //改变主控件的视图范围
  11:                  pMap.CenterAt(pPt);
  12:              }
  13:              else
  14:              {
  15:                  pMap.Extent = pGeometry.Envelope;
  16:                  pMap.ActiveView.Refresh();
  17:              }
  18:          }

IRubberBand 接口的官方解释是”Provides access to members that control simple rubberbanding.”rubberbanding 翻译过来是‘橡皮带式生成线’;直译是提供控制简单橡皮带式生成线的权限,(英语水平太凹了,只能查字典直译了!)就是能够控制按下鼠标左键拉框时的框范围。该接口的TrackNew方法就是将拉框转换成一个地理要素,然后可以根据这个要素对地图范围进行设定。

大功告成,主地图和鹰眼实现双向互动了!

http://www.cnblogs.com/liuyh208/archive/2009/09/28/1576011.html

http://blog.csdn.net/zhongjiekangping/article/details/6618412

一起学习ArcEngine(8)鹰眼相关推荐

  1. ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染

    文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...

  2. ArcEngine 入门教程-帮助如何使用

    声 明1 : 本人才疏学浅,用郭德纲的话说"我是一个小学生",如有错误,欢迎讨论,请勿谩骂^_^. 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保 ...

  3. 学GIS开发怎么入门,GIS专业的学生应该掌握什么知识 ?

    (一) 打好编程基础 这篇文章仅给那些GIS专业的,想学GIS开发的,但现在还没怎么入门不知道该从哪学起的在校生参考的.这篇文章不是讨论GIS开发是否有前途的,也不是讨论做GIS是不是就一定应该做开发 ...

  4. ArcEngine 鹰眼功能C#实现

    ArcEngine开发之鹰眼功能C#实现 鹰眼作为AE系统一项基本功能,经常见于AE开发中.网上鹰眼功能实现大同小异,本文所写示例仅作参考及记录. 一.效果图 二.控件说明 基本AE框架,包括菜单(M ...

  5. 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)

    学习 成长之路(初章 ) 三个月 建成微信小程序商城 .ArcEngine C# GIS开发入门 自我简介 先简单介绍一下,我是Domen,是一个彻彻底底的新手 . 大一 大学大一没好好学习,搞这搞那 ...

  6. 学习在 ArcEngine 中使用 Geoprocessing

    作者:Flyingis Geoprocessing对于ArcGIS使用者来说,是一种非常方便实用的工具,它可以利用ArcToolbox中的各种工具为我们的地理空间工作流进行框架建模,自动执行空间分析与 ...

  7. ArcEngine Hittest学习总结

    arcengine里面hittest是什么,参数是什么意思 public bool HitTest (     IPoint QueryPoint,     double searchRadius, ...

  8. 基于ArcEngine与C#的鹰眼地图实现

    鹰眼图是对全局地图的一种概略表达,具有与全局地图的空间参考和空间范围.为了更好起到空间提示和导航作用,有些还具备全局地图中重要地理要素,如主要河流.道路等的概略表达.通过两个axMapControl控 ...

  9. ArcEngine 入门教程-控件初体验

    缘起 个人总结梳理,顺便练练文笔,For me and for you like me! 目标 我一直很认同古人所说的君子性非异也,善假于物也,本文主要目的是告诉读者如何使用帮助来学习了解ArcEng ...

最新文章

  1. 全球著名音乐抓轨软件EAC 设置详解
  2. Linux Shell Tips小技巧
  3. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
  4. WCF基础 (续 暴露元数据交换节点)
  5. tomcat 修改默认访问根目录
  6. ACM入门之【高精度】
  7. 第四章:滚动堆栈(1)
  8. 老妈~老妈~我爱你~~~~~~~阿弥陀佛保佑你~~~~~~~
  9. python遗传算法工具箱的使用_Deap: python中的遗传算法工具箱
  10. 各种软件系统架构图解析
  11. Docker 搭建 LNMP + Wordpress(详细步骤)
  12. Win10外接显示器可以复制不可以扩展
  13. Dijkstra算法(迪杰斯特拉算法)
  14. 计算机中级职称工作小结,个人专业技术工作小结
  15. 基于STM32的智能抽油烟机系统
  16. Perfmon监控Windows进程性能
  17. solr定时实时重建索引和增量更新——sxt
  18. 【感悟随笔】我只是一直很努力
  19. 斯坦福21秋季:实用机器学习-李沐课程笔记
  20. 【金融风控】信用评分卡模型

热门文章

  1. 三星 android 手机 device log 目录,如何用好Android Studio的logcat
  2. Linux小知识--原始套接字(raw socket)之模拟ping
  3. jmeter重点(详细)
  4. 电力系统导纳矩阵与短路计算matlab程序
  5. android -- ContextMenu 的使用 和 OptionsMenu 区别
  6. java outlook日历_从 Excel 在特定的日历中创建 Outlook 约会
  7. 使用命令“docker exec -it zerotier /bin/bash”进入docker容器报错
  8. Leetcode刷题100天—349. 两个数组的交集(集合)—day08
  9. Xcode修改工程名称 如何修改应用名称
  10. 区分glFrustum和gluPerspective