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

鹰眼图是对全局地图的一种概略表达,具有与全局地图的空间参考和空间范围。为了更好起到空间提示和导航作用,有些还具备全局地图中重要地理要素,如主要河流、道路等的概略表达。通过两个axMapControl控件,主控件axMapControl 1和鹰眼控件axMapControl 2。要实现鹰眼功能,关键技术有两点,一是如何让两个控件使用的数据保持一致,另一点是如何绘制鹰眼控件中的显示方框。

一、数据共享,使用axMapControl1的控件的OnMapReplaced事件。OnMapReplace事件发生MapControl的地图被替换后,即IMapControl2::Map被另一个地图替换时(如IMapControl2::LoadMxFile方法被调用时或map属性被明确替换时)触发该事件。用这个事件来保持与当前图层同步。

 1 private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
 2         {
 3             if (axMapControl1.Map.LayerCount > 0)
 4             {
 5                 for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; i++)
 6                 {
 7                     axMapControl2.AddLayer(axMapControl1.get_Layer(i));
 8                 }
 9                 axMapControl2.Extent=axMapControl1.Extent;
10                 axMapControl2.Refresh();
11             }
12         }

二、显示方框的绘制。在鹰眼控件axMapControl2中使用鼠标拖曳视图时,鹰眼控件axMapControl2中出现红色矩形框。

1)axMapControl1控件的OnExtentUpdated事件。OnExtentUpdated事件在MapControl的可视化范围发生变化后发生,即当IMapControl2::Extent属性发生变化时被触发。改变MapControl中可视化范围的途径包括精确设置范围、缩放、漫游或使用IMapControl2::CenterAt方法等。

 1         private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
 2         {
 3             //获得一个新范围
 4             IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
 5             IGraphicsContainer pGrahicsContainer = axMapControl2.Map as IGraphicsContainer;
 6             IActiveView pActiveView = pGrahicsContainer as IActiveView;
 7             //在绘制前清除axMapControl2中所有图层
 8             pGrahicsContainer.DeleteAllElements();
 9             IRectangleElement pRectangleElement = new RectangleElementClass();
10             IElement pElement = pRectangleElement as IElement;
11             pElement.Geometry = pEnvelope;
12             //设置鹰眼图中的红线框
13             IRgbColor pColor = new RgbColorClass();
14             pColor.Red = 255;
15             pColor.Green = 0;
16             pColor.Blue = 0;
17             pColor.Transparency = 255;
18             //产生一个线符号对象
19             ILineSymbol pOutline = new SimpleLineSymbolClass();
20             pOutline.Width = 3;
21             pOutline.Color = pColor;
22             //设置填充符号颜色
23             pColor = new RgbColorClass();
24             pColor.Red = 255;
25             pColor.Green = 0;
26             pColor.Blue = 0;
27             pColor.Transparency = 0;
28             //设置填充符号
29             IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
30             pFillSymbol.Color = pColor;
31             pFillSymbol.Outline = pOutline;
32
33             IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
34             pFillShapeEle.Symbol = pFillSymbol;
35             pGrahicsContainer.AddElement((IElement)pFillShapeEle, 0);
36             pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
37
38         }

2)axMapControl2控件的OnMouseDown事件。当在MapControl上点击鼠标任何键时触发OnMouseDown事件。

 1  private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
 2         {
 3             if (axMapControl2.Map.LayerCount > 0)
 4             {
 5                 if (e.button == 1)
 6                 {
 7                     IPoint pPoint = new PointClass();
 8                     pPoint.PutCoords(e.mapX, e.mapY);
 9                     axMapControl1.CenterAt(pPoint);
10                     axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
11                 }
12                 else if (e.button == 2)
13                 {
14                     IEnvelope pEnv = axMapControl2.TrackRectangle();
15                     axMapControl1.Extent = pEnv;
16                     axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
17                 }
18             }
19         }

3)axMapControl2控件的OnMouseMove事件。当在MapControl上移动鼠标时不断地触发OnMouseMove事件。

 1  private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
 2         {
 3             if (e.button == 1)
 4             {
 5                 IPoint pPoint = new PointClass();
 6                 pPoint.PutCoords(e.mapX, e.mapY);
 7                 axMapControl1.CenterAt(pPoint);
 8                 axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
 9             }
10         }

三、结论

当axMapControl1中的数据被替换时,axMapControl2中的数据会自动加载axMapControl1的所有图层,实现两者的数据统一。在axMapControl2控件中拖曳或移动地图时,axMapControl1中的地图也在随时变化。

参考文献:基于ArcGIS Engine与C#.net的地图鹰眼功能的实现 南峰

《ArcGIS Engine 10 开发手册》

《ArcObjects二次开发教程》傅仲良 主编

《ArcObjects Developer Help》

时间: 2024-10-19 04:22:47

基于ArcEngine与C#的鹰眼地图实现的相关文章

基于三维GIS技术的矢量地图动态LOD渲染方法研究现状

“地图是人类文化的杰作,它融科学.艺术于一体,作为描述.研究人类生存环境的一种信息载体是人类生产与生活中不可缺少的一种工具.”这是陈述彭院士为<中国地图学年鉴>作序的开场语.Taylor也曾指出“当涉及应用人脑来识别空间联系中的模式与相互关系时,地图学的认知方法是唯一的过程”.地图存在于我们生活的方方面面,应用广泛且己经产生了巨大的社会效应和经济效益,其重要性不言而喻.地图是地图可视化的结果,地图可视化作为现代地图学的核心一直是三维GIS的研究热点.地图可视化将电子设备的视觉传输能力和人类的视

ArcGIS Server 开发之鹰眼地图的实现

鹰眼简单点说就是地图的联动,鹰眼的全称是OverviewMap,在ERSI提供的API包中,在dijit中进行类的调用.查了很多的资料,总结一下: 具体的代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>鹰眼和比例尺</title>

基于ArcEngine开发自己的GIS

对于AE开发实在提不起兴趣,想好好去搞js的开发,无奈这门课要考试,还要做一个设计.所以我决定在设计周来到之前,就把这个开发做出来.然后就可以花样装逼啦.主要是通过写博客能督促自己搞一下,可以尽快完成. 需求分析 1.具备基本的地图操作功能.具备左右窗口间的鹰眼查看. 2.具备基本的查询和统计功能.包括属性.空间和图形的查询.具备一定的分析功能. 3.有一点地图制图的功能.包括符号化和地图标注. 4.具备一定的空间数据编辑功能.包括设置编辑的图层,属性编辑,节点编辑,保存和结束编辑. 5.具有空

一怒之下做了个基于微信公众平台结合百度地图的查公交应用!轻量!方便!快捷!

关于查公交说多了都是泪,一些原生的移动应用不是一堆广告病毒就是过于庞大(好几个G的地图应用),什么都别说了,看图.想体验的同学请关于博主的微信公众平台微信号: webworking 或 扫下面二维码进行关注:

基于vue 2.X和高德地图的vue-amap组件获取经纬度

今天我就讲了一下怎么通过vue和高德地图开发的vue-amap组件来获取经纬度. 这是vue-amap的官网文档:https://elemefe.github.io/vue-amap/#/ 这是我的码云项目的地址:http://git.oschina.net/ye_a_rs/project-vue-ele/tree/master/src 用 vue init webpack 项目名称 创建一个项目 npm安装vue-amap组件 : npm install vue-amap --save 在ma

基于Geoserver发布时间地图

Geoserver它是著名的开源GIS其中软件. 地图服务软件也经常使用的物品.基于geoserver和Openlayers它可以建立一个自由的,开放源码GIS工程. Geoserver公布地图的步骤为: 1.      Geoserver启动 启动Geoserver,并登陆. 登陆后界面如图所看到的 2.      新建工作区. 单击数据栏下的工作区,建立新的工作区,例如以下图所看到的,在Name中输入工作区的名字,本文建立的工作区为karl,命名空间未http://www.cxzx.com,

出售基于Html5的高性能GIS平台源码

远景地理信息系统平台软件 远景地理信息系统平台软件,简称"RemoteGIS",版本V1.0,它是基于HTML5自主研发的新一代WEBGIS平台,它使用Javascript开发,具有良好的系统架构和高可扩展性,功能强大性能超卓. 如果您有意向,请将您的需求通过QQ.邮箱发送给我,我将第一时间联系您. 邮箱:[email protected]   QQ: 49761074 说明 1.出售平台源代码,您可以直接使用源码或对源码进行修改. 2.并非出售平台的所有权利,您可以对源码修改后再申请

百度地图绘制实时路线以及最短线路规划

如何使用百度地图绘制实时路线以及最短线路规划 最近在做百度地图的实时路线绘制,发现一些问题,比如由于定位漂移带来的路线绘制偏差,还有由于定位漂移,导致人未走动时,也会绘制路线等.百度鹰眼的线路纠偏个人感觉很一般啊.而且有限漂移了两百米的点他也没有纠正过来.所以最后还是决定自己写一个纠偏吧.而且百度地图官方的dome和示例代码真的很示例啊.然人摸不着头脑.ok进入正题,思路是这样的,因为实时绘制线路都是在室外,所以只采用gps定位,不采用无线网络定位.这样漂移一两百米的点基本不会出现.第二当人在等

GIS开发离线地图应用-初识gis

最新公司需要做一个基于gis地图的应用系统,由于之前公司项目中的电子地图模块都是我开发的,所以这个新系统也自然让我先去了解如何开发,可以说做个简单的调研. 和之前的项目中开发的电子地图模块不同,这次是开发gis地图,是要显示真实的地理位置,能有gps定位功能的.而之前开发过的电子地图功能,都只是基于svg的矢量可配置地图(之前采用batik开发过C/S版,用raphael开发过B/S版,都在项目中正常使用). 下面描述下我开始开发前做的准备和了解工作,希望对首次接触并想要开发gis离线地图应用的