liutingxiang的个人博客分享 http://blog.sciencenet.cn/u/liutingxiang

博文

ArcGIS Engine二次开发学习(3)鹰眼功能

已有 4725 次阅读 2018-4-2 15:10 |个人分类:地理信息系统二次开发|系统分类:教学心得

鹰眼功能包括:

(1)当主视图中的地图发生变化时,鹰眼视图中的地图也要变化。

(2)鹰眼视图中画一个红色矩形框,红色矩形框的范围表示主视图中的地图范围。

(3)当鹰眼地图中移动红色矩形框时,主视图中的地图范围要发生相应变化;用鼠标右键在鹰眼视图中改变红色矩形框的大小时,主视图中的地图也要进行刷新显示。



首先,定义两个鼠标事件参数,ed、eu。然后预定义三个方法,分别是(1)主视图与鹰眼视图地图同步显示的TbGeoMap();(2)显示红色矩形框的DrawRec();(3)鹰眼地图中移动红色矩形框的方法,MoveEagl();

代码如下:

IMapControlEvents2_OnMouseDownEvent ed;
public IMapControlEvents2_OnMouseDownEvent Ed
        {
            get { return ed; }
            set { ed = value; }
        }
IMapControlEvents2_OnExtentUpdatedEvent eu;
public IMapControlEvents2_OnExtentUpdatedEvent Eu
        {
            get { return eu; }
            set { eu = value; }
        }
        
        
public void TbGeoMap()//主视图与鹰眼视图地图同步
        {

            IMap pMap = axMapControl1.Map;
            int i;
            for (i = 0; i <= pMap.LayerCount - 1; i++)
            {
                axMapControl2.Map.AddLayer(pMap.get_Layer(i));
            }
            axMapControl2.Extent = axMapControl2.FullExtent;//全图显示
            axMapControl2.Refresh();

        }
public void DrawRec()
        {
            IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
            IActiveView pAv = pGraphicsContainer as IActiveView;
            pGraphicsContainer.DeleteAllElements();
            IRectangleElement pRecElement = new RectangleElementClass();
            IElement pEle = pRecElement as IElement;
            IEnvelope pEnv = eu.newEnvelope as IEnvelope;
            pEle.Geometry = pEnv;

            IRgbColor pColor = new RgbColorClass();
            pColor = GetRGB(200, 0, 0);
            pColor.Transparency = 255;

            ILineSymbol pLineSymbol = new SimpleLineSymbolClass();
            pLineSymbol.Width = 2;
            pLineSymbol.Color = pColor;

            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();

            pColor.Transparency = 0;
            pFillSymbol.Color = pColor;
            pFillSymbol.Outline = pLineSymbol;
            IFillShapeElement pFillShapeElement = pRecElement as IFillShapeElement;
            pFillShapeElement.Symbol = pFillSymbol;
            pGraphicsContainer.AddElement(pEle, 0);
            axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
 
        }
        
public void MoveEagl()
        {
            
            if (ed.button == 1)//鼠标左键
            {
                IPoint pPt = new PointClass();
                pPt.X = ed.mapX;
                pPt.Y = ed.mapY;
                IEnvelope pEnvelope = axMapControl1.Extent as IEnvelope;
                pEnvelope.CenterAt(pPt);
                axMapControl1.Extent = pEnvelope;
                axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
            }
            else if (ed.button == 2)
            {
                IEnvelope pEnvelope = axMapControl2.TrackRectangle();
                axMapControl1.Extent = pEnvelope;
                axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
            }
        }

最后,在地图控件的事件代码中添加对方法的调用,以及鼠标事件参数属性值的赋值。

private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
    {
      TbGeoMap();
    }
private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
    {
      eu = e;
      TbGeoMap();
      DrawRec();            
    }
private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
    {
      ed = e;
      MoveEagl();
    }


鹰眼窗口的图层顺序会和主视图中的图层顺序相反,需要改一下鹰眼窗口中添加图层的顺序。

public void TbGeoMap()//主视图与鹰眼视图地图同步
        {

            IMap pMap = axMapControl1.Map;
            int i;
            for (i = pMap.LayerCount - 1; i >=0 ; i--)
            {
                axMapControl2.Map.AddLayer(pMap.get_Layer(i));
            }
            axMapControl2.Extent = axMapControl2.FullExtent;//全图显示
            axMapControl2.Refresh();

        }



P.S.

鹰眼窗口可以设置为浮动窗口,在设置菜单中添加一个菜单,开启/关闭鹰眼窗口。

浮动鹰眼窗口可以是一个windows窗体,也可以直接放在TOC下面(靠近左右下侧)。



https://blog.sciencenet.cn/blog-3373120-1106989.html

上一篇:ArcGIS Engine二次开发学习(2)鼠标与控件互操作
下一篇:ArcGIS Engine二次开发学习(4)地图控件和布局控件联动
收藏 IP: 121.69.12.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 00:32

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部