ArcGIS Engine开发鹰眼图的功能(基础篇)

鹰眼是用于调节全视域范围内主地图显示范围情况的副地图它体现了地图整体与详细局部的关系。

用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况

鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼地图窗口的地图控件的4个事件即可完成整个实现流程,但这4个事件之间存在一定的逻辑关系。首先我们了解一下这4个事件的触发条件以及实现的功能。

(1)主地图窗口地图控件
OnMapReplace_Event事件是在主地图控件加载地图文档或者图层时触发,它主要用来完成主地图与鹰眼地图的地图同步工作
OnExtentUpdated_Event事件是主地图的Extent(显示范围)属性值发生变化时触发,主要的功能是在鹰眼地图窗口上绘制一个线框用来表示主地图窗口的显示范围。

(2)鹰眼地图窗口地图控件

主要用来捕捉鼠标在鹰眼地图上的动作,并调用相应的处理方法,根据用户的动作改变主地图的Extent属性。

OnMouseDown_Event事件在鼠标单击(左键移动,右键选取视域范围)触发

OnMouseMove_Event事件在鼠标移动时触发。

(1)主地图窗口地图控件
OnMapReplace_Event事件是在主地图控件加载地图文档或者图层时触发,它主要用来完成主地图与鹰眼地图的地图同步工作

/// <summary>
/// 主地图OnMapReplaced事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
{
    //主地图有地图或图层的时候鹰眼加载图层
    if (axMapControl1.LayerCount > 0)
    {
        axMapControl2.ClearLayers(); //先清除鹰眼的地图
        //图层自下而上加载,防止要素间互相压盖
        for (int i = axMapControl1.Map.LayerCount - 1; i >= 0; i--)
        {
            axMapControl2.AddLayer(axMapControl1.get_Layer(i));
        }
        //设置鹰眼地图鱼主地图相同空间参考系
        //必要:防止由于图层放置顺序改变而改变了鹰眼的空间参考系
        axMapControl2.SpatialReference = axMapControl1.SpatialReference;
        //设置鹰眼的显示范围=完整显示(FullExtent)
        axMapControl2.Extent = axMapControl2.FullExtent;
        //每次加载或者删除图层之后都要刷新一次MapControl
        axMapControl2.Refresh();
    }
}


OnExtentUpdated_Event事件是主地图的Extent(显示范围)属性值发生变化时触发,主要的功能是在鹰眼地图窗口上绘制一个线框用来表示主地图窗口的显示范围。

/// <summary>
/// 主地图OnExtentUpdated事件(使用面要素刷新)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
{
    //刷新axMapControl2
    axMapControl2.Refresh();
    //以主地图的Extent作为鹰眼红线框的大小范围
    IEnvelope pEnvelope = axMapControl1.Extent;
    //鹰眼强制转换为IGraphicsContainer
    //IGraphicsContainer是绘图容器接口, 主要功能是在MapControl控件类上添加绘图要素。
    IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
    //鹰眼强制转换为pActiveView
    IActiveView pActiveView = pGraphicsContainer as IActiveView;
    //删除鹰眼原有要素
    pGraphicsContainer.DeleteAllElements();
    //实例化矩形框要素
    IRectangleElement pRectangleElement = new RectangleElementClass();
    //强转矩形要素框为要素
    IElement pElement = pRectangleElement as IElement;
    //赋值几何实体的最小外接矩形, 即包络线
    pElement.Geometry = pEnvelope;

    //使用面要素刷新(存在覆盖注释问题)
    DrawPolyline2(pGraphicsContainer, pActiveView, pElement);
}
/// <summary>
/// 使用面要素刷新(存在覆盖注释问题)
/// </summary>
/// <param name="pGraphicsContainer"></param>
/// <param name="pActiveView"></param>
/// <param name="pElement"></param>
private static void DrawPolyline2(IGraphicsContainer pGraphicsContainer, IActiveView pActiveView, IElement pElement)
{
    //以下代码设置要素外框边线的颜色、透明度属性
    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.NullColor = true;

    //以下代码设置要素内部的填充颜色、边线符号属性
    IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
    pFillSymbol.Color = pColor;
    pFillSymbol.Outline = pOutline;

    //实现线框的生成
    IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
    pFillShapeElement.Symbol = pFillSymbol;
    pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);

    //刷新鹰眼视图的填充要素(绘图框)
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pFillShapeElement, null);
}

(2)鹰眼地图窗口地图控件

主要用来捕捉鼠标在鹰眼地图上的动作,并调用相应的处理方法,根据用户的动作改变主地图的Extent属性。

OnMouseDown_Event事件在鼠标单击(左键移动,右键选取视域范围)触发

/// <summary>
/// 鹰眼地图的OnMouseDown事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
    if (axMapControl2.LayerCount > 0)
    {
        //如果e.button==1, 则表示按下的是鼠标左键
        if (e.button == 1)
        {
            axMapControl2.Refresh();
            //捕捉鼠标单击时的地图坐标
            IPoint pPoint = new PointClass();
            pPoint.PutCoords(e.mapX, e.mapY);
            //将地图的中心点移动到鼠标点击的点pPoint
            axMapControl1.CenterAt(pPoint);
            axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
        }
        else if (e.button == 2)
        {//如果e.button==2, 则表示按下的是鼠标右键
            //鹰眼地图的TrackRectangle()方法, 随着鼠标拖动得到一个矩形框
            IEnvelope pEnvelope = axMapControl2.TrackRectangle();
            axMapControl1.Extent = pEnvelope;//鼠标拖动生成的矩形框范围
            axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
        }
    }
}

OnMouseMove_Event事件在鼠标移动时触发。

/// <summary>
/// 鹰眼地图的OnMouseMove事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
{
    //如果e.button==1, 则表示按下的是鼠标左键
    if (e.button == 1)
    {
        axMapControl2.Refresh();
        //捕捉鼠标单击时的地图坐标
        IPoint pPoint = new PointClass();
        pPoint.PutCoords(e.mapX, e.mapY);
        //将地图的中心点移动到鼠标点击的点pPoint
        axMapControl1.CenterAt(pPoint);
        axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
    }
}

下一篇:ArcGIS Engine开发鹰眼图的功能(代码优化篇)

谢谢大家观看!

原文地址:https://www.cnblogs.com/edcoder/p/11731946.html