基于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》

           

 

转载于:https://www.cnblogs.com/vegetable/p/4101844.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1178. 猜字谜(状态压缩+枚举二进制子集+哈希)

文章目录1. 题目2. 解题1. 题目 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏&#xff0c;请你来猜猜看吧。 字谜的迷面 puzzle 按字符串形式给出&#xff0c;如果一个单词 word 符合下面两个条件&#xff0c;那么它就可以算作谜底&#xff1a; 单词 word 中包含谜面 …

elasticsearch 工作原理_【154期】面试官:你能说说 Elasticsearch 查询数据的工作原理是什么吗?...

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅阶段汇总集合&#xff1a;一百期面试题汇总面试题ES 写入数据的工…

php另类上传图片的方法(PHP用Socket上传图片)

服务器端&#xff1a; 。 代码如下:<?phpset_time_limit(10);//* 设置不显示任何错误 *///error_reporting(0); function varinfo($str) {echo "<PRe>";var_dump($str);echo "<pre>";} $commonProtocol getprotobyname("tcp");…

java会被淘汰吗_Java不会被淘汰的12个原因

如今&#xff0c;面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上或许会成为下一个COBOL。有关JAVA的技术卖出多少本书已经是一个很久远的记忆了。现处中年…

Java 关于类的专题

文章目录1. Object 类2. 内部类3. 覆写 Object 类的 equals 方法4. 接口对象实例化5. this() 调用无参构造方法6. static 属性所有对象共享一份7. static 方法不能调用 非static 属性8. 静态代码块9. final 关键字10. instanceof 关键字1. Object 类 所有的类都是继承于 Objec…

pythonmain是什么意思_Python中if __name__ == __main__详细解释

想必很多初次接触python都会见到这样一个语句&#xff0c;if __name__ "__main__"&#xff1a; 那么这个语句到底是做什么用的呢&#xff1f;在解释之前&#xff0c;首先要声明的是&#xff0c;不管你是多么小白&#xff0c;你一定要知道的是&#xff1a; 1.python文…

java操作redis的操作_Java操作redis简单示例

第一&#xff1a;安装Redis首先我们要安装Redis&#xff0c;就像我们操作数据库一样&#xff0c;在操作之前肯定要先创建好数据库的环境。Redis的下载可以百度一下&#xff0c;或者打开下面的下载链接&#xff1a;https://github.com/MSOpenTech/redis也可以从我的百度网盘下载…

myeclipse启动报JVM terminated. Exit code=1

报错信息如图&#xff1a; 解决办法&#xff1a; 删除当前workspaces下文件夹&#xff0c;路径为&#xff1a;%Workspaces%/.metadata/.plugins/org.eclipse.core.runtime转载于:https://www.cnblogs.com/tancp/p/4102866.html

Java 常用类库

文章目录1. String、StringBuffer2. 基本数据类3. System 类4. Runtime 类5. Date、Calendar、DateFormat 类6. Math、Random 类7. hashCode() 方法8. 对象克隆1. String、StringBuffer public class testString {public static void main(String [] args){String s "Mi…

git如何选择性合并_小姐姐用 10 张动图,教会你 Git 命令使用

优质文章&#xff0c;第一时间送达&#xff01;来源&#xff1a;机器之心git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗&#xff1f;如果你还有些分不清楚&#xff0c;那千万不能错过这篇文章…

传智播客java测试题_传智播客Java基础综合测试题

传智播客Java基础综合测试题传智播客Java基础综合测试题第一关1.动手完成 Java 开发包的安装&#xff0c;并设置环境变量 Path 。2.编写一个程序&#xff0c;要求程序运行后在屏幕上输出&#xff1a;***************************This is my first java program!***************…

为何Spark更高效?

learn from 从0开始学大数据&#xff08;极客时间&#xff09; Spark 的计算阶段 Hadoop MapReduce 简单粗暴地根据 shuffle 将大数据计算分成 Map 和 Reduce 两个阶段&#xff0c;然后就算完事了。 而 Spark 更细腻一点&#xff0c;将前一个的 Reduce 和后一个的 Map 连接起来…

iphone个系列尺寸_最值得入手的4款iPhone,都是内行人的最爱,拿出去有面子

现如今手机市场里最受大众欢迎的手机应该就是iPhone了&#xff0c;虽然iPhone的价格都普遍偏高&#xff0c;但是大家依然还是非常青睐于它&#xff0c;主要是因为iPhone的配置和性能确实是比其他机型要好&#xff0c;搭载的A系列仿生芯片和iOS系统都提升了它的性能&#xff0c;…

protocol(协议) 和 delegate(委托)也叫(代理)---辨析

protocol和delegate完全不是一回事。协议(protocol)&#xff0c;&#xff08;名词&#xff09;要求。就是使用了这个协议后就要按照这个协议来办事&#xff0c;协议要求实现的方法就一定要实现。委托(delegate)&#xff0c;&#xff08;动词&#xff09;助手。顾名思义就是委托…

redis 计数 java_redission计数器实现,redisTemplate计数器

在redission 2.9.0版本之前是有BUG&#xff0c;在实现下面代码时&#xff0c;第一次是成功的&#xff0c;但是在第二次就会失败&#xff1a;RedissonClient client;//client参考别的demoRMapCache mapCache client.getMapCache("nameSpace");mapCache.putIfAbsent(&…

天池 在线编程 能否转换

文章目录1. 题目2. 解题1. 题目 给两个字符串 S 和 T, 判断 S 能不能通过删除一些字母(包括0个)变成 T. 样例1 输入: S "lintcode" 和 T "lint" 输出: true样例2 输入: S "lintcode" 和 T "ide" 输出: true样例3 输入: S "…

java对象持久化技术_Java对象持久化技术Hibernate 一

Hibernate是Java应用和关系数据库之间的桥梁&#xff0c;它负责Java对象和关系数据之间的映射。Hibernate内部封装了通过JDBC访问数据库的操作&#xff0c;向上层应用提供了面向对象的数据访问API。在Java应用中使用Hibernate包含以下步骤。(1)创建Hibernate的配置文件。(2)创建…

SQL获取变量类型以及变量最大长度

DECLARE Temp nvarchar(1050) SELECT CAST(SQL_VARIANT_PROPERTY(Temp, BaseType) AS VARCHAR(50))SELECT CAST(SQL_VARIANT_PROPERTY(Temp, MaxLength) AS VARCHAR(50))转载于:https://www.cnblogs.com/lhmlyx2723356/p/4105322.html

java 析构函数_C++与Java的区别(一)

一&#xff0c;前言网上经常看到编程语言之争&#xff0c;大伙儿皈依到不同门派&#xff0c;各自怀抱信仰&#xff0c;时不时还发生点儿“冲突”。这其中&#xff0c;C和Java的优劣&#xff0c;十多年前就常吵的火热。然而时代在进步&#xff0c;技术在发展&#xff0c;满街早已…

天池 在线编程 圣杯咒语

文章目录1. 题目2. 解题1. 题目 一段英文中同时出现大小写的字母中最大的那一个&#xff0c;现在给你一段英文&#xff0c;你能把这个字母找出来嘛&#xff1f; ps:一定存在答案 英文长度不会超过100000 样例 1&#xff1a; 输入&#xff1a;"aAbb" 输出&#xf…