- GIS论坛-GIS空间站 ( http://bbs.gissky.net/Default.asp )
-- 编程技术交流 ( http://bbs.gissky.net/ShowForum.asp?forumid=22 )
--- [分享]鹰眼的另一种表现 ( http://bbs.gissky.net/ShowPost.asp?id=44000 )
作者:Andyjiang
发表时间:2008-5-2 16:33:18
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Controls; /* * 鹰眼视图的简单实现,只是通过拖动鹰眼视图的区域实现在主视图中的显示: */ namespace OverView { public partial class MainForm : Form { #region "界面初始化" public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { try { string strFileName = Application.StartupPath + @"\数据\房地产策划信息系统.mxd"; //在数据视图中加载地图,供查询操作 if (axMapControl2.CheckMxFile(strFileName)) { axMapControl2.LoadMxFile(strFileName); } else { MessageBox.Show("错误的数据路径:" + strFileName); } } catch (Exception ex) { MessageBox.Show("Error01 in MainForm.cs" + ex.Message); } } #endregion "界面初始化" #region "鹰眼地图" /* 实现功能: * 1、鹰眼控件会根据主控件的视图范围生成一个来导航 * 2、在鹰眼控件里点击左键移动,红色距形框会跟着鼠标移动,主控件的视图范围会根据红色距形框位置而做出相应的移动 * 3、在鹰眼控件中可以通过按住鼠标右键来拖动,生成一个新的红色距形框,来导航 * 实现步骤如下(通过多个例子综合而成,write by booker,2008.4.12 */ //1.鹰眼地图资源载入 //当数据视图文档发生变化后,把文档加载到鹰眼视图的地图控件axMapControl1中 private void axMapControl2_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) { //加载地图文档到MapControl中 axMapControl1.LoadMxFile(axMapControl2.DocumentFilename, null, null); //设置MapControl显示范围至数据的全局范围 axMapControl1.Extent = axMapControl1.FullExtent; } //2.绘制鹰眼矩形框 private void axMapControl2_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) { // 得到新范围 IEnvelope pEnv = (IEnvelope)e.newEnvelope; IGraphicsContainer pGra = axMapControl1.Map as IGraphicsContainer; IActiveView pAv = pGra as IActiveView; //在绘制前,清除鹰眼axMapControl1中的任何图形元素 pGra.DeleteAllElements(); IRectangleElement pRectangleEle = new RectangleElementClass(); IElement pEle = pRectangleEle as IElement; pEle.Geometry = pEnv; //设置鹰眼图中的红线框 IRgbColor pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 255; //产生一个线符号对象 ILineSymbol pOutline = new SimpleLineSymbolClass(); pOutline.Width = 2; pOutline.Color = pColor; //设置颜色属性 pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 0; //设置填充符号的属性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; IFillShapeElement pFillShapeEle = pEle as IFillShapeElement; pFillShapeEle.Symbol = pFillSymbol; pGra.AddElement((IElement)pFillShapeEle, 0); //刷新 pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } //3. 实现互动 private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) { /* IPoint pPt = new PointClass(); pPt.PutCoords(e.mapX, e.mapY); //改变主控件的视图范围 axMapControl2.CenterAt(pPt); */ if (e.button == 1) { IPoint pPt = new PointClass(); pPt.X = e.mapX; pPt.Y = e.mapY; IEnvelope pEnvelope = this.axMapControl1.TrackRectangle(); this.axMapControl2.Extent = pEnvelope; } } private void axMapControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) { if (e.button == 1) { IPoint pPt = new PointClass(); pPt.X = e.mapX; pPt.Y = e.mapY; // IEnvelope pEnvelope = this.axMapControl2.Extent as IEnvelope; pEnvelope.CenterAt(pPt); this.axMapControl2.Extent = pEnvelope; } } #endregion "鹰眼地图" } }
作者:tsing_feng
发表时间:2008-5-3 22:35:29
Good
发表您的观点,进入该主题参与讨论...
作者:GIS攀登
发表时间:2008-5-4 9:59:00
Very Good!
发表您的观点,进入该主题参与讨论...
作者:兔八哥
发表时间:2008-5-5 8:26:49
赞一个。
发表您的观点,进入该主题参与讨论...
作者:王明亮
发表时间:2008-6-8 0:31:46
呵呵 ,为什么在vb+mapx下就能很容易实现的功能要用这么复杂的过程去完成呢 ?当然很欣赏楼主的资源公用风格,
发表您的观点,进入该主题参与讨论...
作者:zhuminglong
发表时间:2008-7-23 15:47:58
谢谢楼主,这代码对我很有用啊!
发表您的观点,进入该主题参与讨论...
作者:gzstyxb
发表时间:2008-8-10 11:53:19
有更好的做法,就是把该功能封装成独立的组件。这样便于独立、重复使用。
发表您的观点,进入该主题参与讨论...
|