麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

ArcGIS Engine 10 开发手册(3-6)鹰眼图的实现

鹰眼图的实现用到控件如下::

控件名称

控件类型

备注

axMapControl1

主图

axMapControl2

鸟瞰图

axToolbarControl1

axTOCControl1

实现分析

鹰眼图的操作主要由以下几个动作,当在一个控件中移动一幅图的时候另一控件中的图也发生 变化,当在主控件中重新加载一幅图的时候,另外一个控件的图也发生相应的变化,同时我们在鸟瞰的控 件中加入一红色边框,注意这个其实是一个面,只是填充的颜色是透明的而已。通过分析我们知道,我们 要添加两个 MapControl 控件,名字分别是 axMapControl1 和 axMapControl2,其中 axMapControl1 为主图, 而 axMapControl2 为鸟瞰图。

代码实现

对于名称为 axMapControl1 的 MapControl 控件,只需要在 axMapControl1 的 OnExtentUpdated 和 OnMapReplaced 中分别添加以下代码:

private void axMapControl1_OnExtentUpdated (object sender,IMapControlEvents2_OnExtentUpdatedEvent e)
{
  // 得到新范围
  IEnvelope pEnvelope = (IEnvelope) e.newEnvelope;

  IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;

  IActiveView pActiveView = pGraphicsContainer as IActiveView;

  //在绘制前,清除axMapControl2中的任何图形元素 
  pGraphicsContainer.DeleteAllElements();

  IRectangleElement pRectangleEle = new RectangleElementClass ();
  IElement pElement = pRectangleEle as IElement;
  pElement.Geometry = pEnvelope;

  //设置鹰眼图中的红线框

  IRgbColor pColor = new RgbColorClass ();
  pColor.Red = 255;
  pColor.Green = 0;
  pColor.Blue = 0;
  pColor.Transparency = 255;

  //产生一个线符号对象

  ILineSymbol pOutline = new SimpleLineSymbolClass ();
  pOutline.Width = 3;
  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 = pElement as IFillShapeElement;
  pFillShapeEle.Symbol = pFillSymbol;
  pGraphicsContainer.AddElement ((IElement) pFillShapeEle, 0);

  pActiveView.PartialRefresh (esriViewDrawPhase.esriViewGraphics, null,null);

}

private void axMapControl1_OnMapReplaced (object sender,IMapControlEvents2_OnMapReplacedEvent e)
{
  if (axMapControl1.LayerCount > 0)
  {
    axMapControl2.Map = new MapClass ();
    for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; i++)
    {
      axMapControl2.AddLayer (axMapControl1.get_Layer (i));
    }
    axMapControl2.Extent = axMapControl1.Extent;
    axMapControl2.Refresh ();
  }
}

对于名称为 axMapControl2 的 MapControl 控件,只需要在 axMapControl2 的 OnMouseMove 和OnMouseDown 中分别添加以下代码:

private void axMapControl2_OnMouseMove (object sender,IMapControlEvents2_OnMouseMoveEvent e)
{
  if (e.button == 1)
  {
    IPoint pPoint = new PointClass ();
    pPoint.PutCoords (e.mapX, e.mapY);
    axMapControl1.CenterAt (pPoint);
    axMapControl1.ActiveView.PartialRefresh (esriViewDrawPhase.esriViewGeography, null, null);
  }
}

private void axMapControl2_OnMouseDown (object sender,IMapControlEvents2_OnMouseDownEvent e)
{
  if (axMapControl2.Map.LayerCount > 0)
  {
    if (e.button == 1)
    {
      IPoint pPoint = new PointClass ();
      pPoint.PutCoords (e.mapX, e.mapY);
      axMapControl1.CenterAt (pPoint);
      axMapControl1.ActiveView.PartialRefresh (esriViewDrawPhase.esriViewGeography, null, null);
    } 
    else if (e.button == 2)
    {
      IEnvelope pEnv = axMapControl2.TrackRectangle ();
      axMapControl1.Extent = pEnv;
      axMapControl1.ActiveView.PartialRefresh (esriViewDrawPhase.esriViewGeography, null, null);
    }
  }
}

运行结果

运行后的效果如下:

ArcGIS Engine 10 开发手册全集

ArcGIS Engine 10 开发手册全集: ArcGIS Engine 10 开发手册

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

已有 2 条评论

  1. 麻辣GIS-王
    1#
     · 2018-04-22 22:49

    axMapControl2.AddLayer (axMapControl1.get\ _Layer (i));代码有误,请修改一下
    应为:axMapControl2.AddLayer (axMapControl1.get_Layer (i));

留言板(小编看到第一时间回复) 取消回复