一起学习ArcEngine(8)鹰眼
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)鹰眼相关推荐
- ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染
文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...
- ArcEngine 入门教程-帮助如何使用
声 明1 : 本人才疏学浅,用郭德纲的话说"我是一个小学生",如有错误,欢迎讨论,请勿谩骂^_^. 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保 ...
- 学GIS开发怎么入门,GIS专业的学生应该掌握什么知识 ?
(一) 打好编程基础 这篇文章仅给那些GIS专业的,想学GIS开发的,但现在还没怎么入门不知道该从哪学起的在校生参考的.这篇文章不是讨论GIS开发是否有前途的,也不是讨论做GIS是不是就一定应该做开发 ...
- ArcEngine 鹰眼功能C#实现
ArcEngine开发之鹰眼功能C#实现 鹰眼作为AE系统一项基本功能,经常见于AE开发中.网上鹰眼功能实现大同小异,本文所写示例仅作参考及记录. 一.效果图 二.控件说明 基本AE框架,包括菜单(M ...
- 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)
学习 成长之路(初章 ) 三个月 建成微信小程序商城 .ArcEngine C# GIS开发入门 自我简介 先简单介绍一下,我是Domen,是一个彻彻底底的新手 . 大一 大学大一没好好学习,搞这搞那 ...
- 学习在 ArcEngine 中使用 Geoprocessing
作者:Flyingis Geoprocessing对于ArcGIS使用者来说,是一种非常方便实用的工具,它可以利用ArcToolbox中的各种工具为我们的地理空间工作流进行框架建模,自动执行空间分析与 ...
- ArcEngine Hittest学习总结
arcengine里面hittest是什么,参数是什么意思 public bool HitTest ( IPoint QueryPoint, double searchRadius, ...
- 基于ArcEngine与C#的鹰眼地图实现
鹰眼图是对全局地图的一种概略表达,具有与全局地图的空间参考和空间范围.为了更好起到空间提示和导航作用,有些还具备全局地图中重要地理要素,如主要河流.道路等的概略表达.通过两个axMapControl控 ...
- ArcEngine 入门教程-控件初体验
缘起 个人总结梳理,顺便练练文笔,For me and for you like me! 目标 我一直很认同古人所说的君子性非异也,善假于物也,本文主要目的是告诉读者如何使用帮助来学习了解ArcEng ...
最新文章
- 全球著名音乐抓轨软件EAC 设置详解
- Linux Shell Tips小技巧
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
- WCF基础 (续 暴露元数据交换节点)
- tomcat 修改默认访问根目录
- ACM入门之【高精度】
- 第四章:滚动堆栈(1)
- 老妈~老妈~我爱你~~~~~~~阿弥陀佛保佑你~~~~~~~
- python遗传算法工具箱的使用_Deap: python中的遗传算法工具箱
- 各种软件系统架构图解析
- Docker 搭建 LNMP + Wordpress(详细步骤)
- Win10外接显示器可以复制不可以扩展
- Dijkstra算法(迪杰斯特拉算法)
- 计算机中级职称工作小结,个人专业技术工作小结
- 基于STM32的智能抽油烟机系统
- Perfmon监控Windows进程性能
- solr定时实时重建索引和增量更新——sxt
- 【感悟随笔】我只是一直很努力
- 斯坦福21秋季:实用机器学习-李沐课程笔记
- 【金融风控】信用评分卡模型
热门文章
- 三星 android 手机 device log 目录,如何用好Android Studio的logcat
- Linux小知识--原始套接字(raw socket)之模拟ping
- jmeter重点(详细)
- 电力系统导纳矩阵与短路计算matlab程序
- android -- ContextMenu 的使用 和 OptionsMenu 区别
- java outlook日历_从 Excel 在特定的日历中创建 Outlook 约会
- 使用命令“docker exec -it zerotier /bin/bash”进入docker容器报错
- Leetcode刷题100天—349. 两个数组的交集(集合)—day08
- Xcode修改工程名称 如何修改应用名称
- 区分glFrustum和gluPerspective