Arcgis Engine - 鹰眼(减少闪烁)
网上看到的代码,都是一个模样,经过不断调试,无意中效果就可以了.主要是在"鼠标拖动的时候",网上的代码的鹰眼效果,感觉坑爹死了,闪烁超级严重.主要原因是鼠标拖动的时候,进行时时更新.(该博文的鹰眼可能针对栅格图不起作用,可以参考我的这篇博文(arcgis engine - 鹰眼在栅格图无法显示.)
我在"天地图"上,它实现的效果也是鼠标拖动放开后才更新.以下是我对网上的代码进行稍微的改动:
主视图:
#region 主视图事件.
//同步鹰眼视图和主视图.
private void map_main_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e) {
mapCtrl_view.ClearLayers();
for (int i = 0; i < mapCtrl_main.LayerCount; i++) mapCtrl_view.AddLayer(mapCtrl_main.get_Layer(i));
mapCtrl_view.Extent = mapCtrl_main.FullExtent;
mapCtrl_main.Refresh();
}
//画轮廓.
private void map_main_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) {
DrawSymbol(sender, (ESRI.ArcGIS.Geometry.IEnvelope)e.newEnvelope);
}
#endregion
辅助方法:
/// <summary>
/// 返回颜色.
/// </summary>
/// <param name="rgb">rgb的值</param>
/// <param name="transparency">透明度[0,255](0为全透明)</param>
/// <returns>颜色对象.</returns>
ESRI.ArcGIS.Display.IRgbColor ColorPaint(int rgb, byte transparency) {
ESRI.ArcGIS.Display.IRgbColor rgbColor = new ESRI.ArcGIS.Display.RgbColorClass();
rgbColor.RGB = rgb;
rgbColor.Transparency = transparency;
return rgbColor;
} /// <summary>
/// 画轮廓.
/// </summary>
/// <param name="sender"></param>
/// <param name="e">根据IEnvelope对象画轮廓.</param>
void DrawSymbol(object sender, ESRI.ArcGIS.Geometry.IEnvelope e) {
ESRI.ArcGIS.Carto.IGraphicsContainer hawkGC = (ESRI.ArcGIS.Carto.IGraphicsContainer)mapCtrl_view.Map;
ESRI.ArcGIS.Carto.IActiveView aView = (ESRI.ArcGIS.Carto.IActiveView)hawkGC;
hawkGC.DeleteAllElements(); ESRI.ArcGIS.Carto.IElement recEle = (ESRI.ArcGIS.Carto.IElement)new ESRI.ArcGIS.Carto.RectangleElementClass();
recEle.Geometry = e;
ESRI.ArcGIS.Display.ISimpleLineSymbol outLine = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
outLine.Color = ColorPaint(, );
outLine.Width = ; //填充样式.
ESRI.ArcGIS.Display.ISimpleFillSymbol fillSym = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();
fillSym.Color = ColorPaint(, );
fillSym.Outline = outLine; ESRI.ArcGIS.Carto.IFillShapeElement fillShape = (ESRI.ArcGIS.Carto.IFillShapeElement)recEle;
fillShape.Symbol = fillSym;
hawkGC.AddElement((ESRI.ArcGIS.Carto.IElement)fillShape, );
aView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, null);
}
鹰眼视图:
#region 鹰眼事件.
private void map_view_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) {
if (mapCtrl_main.LayerCount < ) return;
if (e.button == ) { //点选.
ESRI.ArcGIS.Geometry.IPoint ptNew = new ESRI.ArcGIS.Geometry.PointClass();
ptNew.PutCoords(e.mapX, e.mapY);
}
else if (e.button == ) //右键框选.
{
interEnvelope = mapCtrl_view.TrackRectangle();
//记录感兴趣区.
mapCtrl_main.Extent = interEnvelope;
}
mapCtrl_main.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, null, null);
} private void map_view_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) {
if (e.button == && interEnvelope != null) {
//鼠标移动,轮廓跟着变,但是主视图不更新,直到鼠标放开.
interEnvelope.PutCoords(e.mapX - interEnvelope.Width / , e.mapY - interEnvelope.Height / , e.mapX + interEnvelope.Width / , e.mapY + interEnvelope.Height / );
DrawSymbol(sender, interEnvelope);
}
} private void map_view_OnMouseUp(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseUpEvent e) {
//鼠标放开时同步更新主视图,和map_view_OnMouseMove搭配.
ESRI.ArcGIS.Geometry.IPoint ptNew = new ESRI.ArcGIS.Geometry.PointClass();
ptNew.PutCoords(e.mapX, e.mapY);
mapCtrl_main.CenterAt(ptNew);
mapCtrl_main.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, null, null);
}
#endregion
Arcgis Engine - 鹰眼(减少闪烁)的更多相关文章
- arcgis engine - 鹰眼在栅格图无法显示.
一般,如果是矢量图,则不会出现这样的情况,鹰眼图无法显示,这时,只要在主控件的OnMapReplaced中显示指定鹰眼控制的空间参照,即可,如:在map_Big_OnMapReplaced方法中,添加 ...
- 《ArcGIS Engine+C#实例开发教程》第五讲 鹰眼的实现
原文:<ArcGIS Engine+C#实例开发教程>第五讲 鹰眼的实现 摘要:所谓的鹰眼,就是一个缩略地图,上面有一个矩形框,矩形框区域就是当前显示的地图区域,拖动矩形框可以改变当前地图 ...
- ArcGIS Engine开发鹰眼图的功能(代码优化篇)
在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话, ...
- ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- ArcGIS Engine开发之地图基本操作(3)
地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...
- ArcGIS Engine开发前基础知识(4)
ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想 ...
- ArcGIS Engine开发之旅05---空间数据库
原文:ArcGIS Engine开发之旅05---空间数据库 1 Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...
- arcgis engine 开发教程系列
版权声明: <ArcGIS Engine+C#实例开发教程>为3SDN(http://www.3sdn.net)原创教程,版权所有.禁止商业用途转载(如需请联系作者),非商业 ...
随机推荐
- html5 js跨域
介绍 当我们使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Acce ...
- ADODB的应用
<?php include_once ('adodb5/adodb.inc.php'); $db = NewADOConnection ('mysql'); $db->Connect(&q ...
- PHP高效的敏感词过滤方法
<?php // 测试文件demo.php $badword = array( '张三','张三丰','张三丰田' ); // array_combine() 函数通过合并两个数组来创建一个新数 ...
- MVC4,4月22日,Ninject的另外注入方式。
学习了Ninject另外两种绑定注入的方式: 1.根据属性绑定 先在特殊的实现借口类中定义属性 使用 2.根据构造函数方式绑定 学习了条件绑定方式(conditional bindi ...
- JavaScript常用
打印日志 console.log 类型判断 第一种方式var type = Object.prototype.toString.call(list);console.log(type);第二种方式ty ...
- ubuntu设置系统时间与网络时间同步
ubuntu设置系统时间与网络时间同步 Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC). 系统时间:指当前Linux Ker ...
- APMServ5.2.6升级PHP
前言:这两天闲着没事,就想学一下ThinkPHP.学习ThinkPHP要先安装好Apache.MySQL .PHP等运行环境. 为了方便起见,打算就用集成环境.ThinkPHP官方网站推荐的是“WAM ...
- ExpandableListView(可展开的列表组件)的说明以及其用法
ExpandableListView的用法和ListView非常像,只是其所显示的列表项应该由ExpandableListAdapter提供,下面是它的xml属性及说明: 然而,接下来是用事实说话了: ...
- Android中程序包的相关操作
//获取系统中已经安装的应用程序 List<PackageInfo> packageinfos=this.getPackageManager().getInstalledPackages( ...
- 如何通过ftell和fseek来获取文件大小
#include <stdio.h> int main () { FILE * pFile=NULL; long size; pFile = fopen ("myfile.txt ...