ArcEngine 10.2 捕捉使用

本文详细介绍了ArcEngine中实现捕捉的两种方式:IEngineSnapEnvironment和ISnappingEnvironment。重点对比了新旧接口的优缺点,并提供了C#实现捕捉的具体步骤,包括如何设置捕捉类型、显示样式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近看了下ArcEngine的捕捉,记录下,以备后用,如果转载,请注明出处。

  除了自己编码实现的捕捉效果,ArcEngine主要通过两个接口实现捕捉,即ISnappingEnvironment和IEngineSnapEnvironment,刚开始我看到这两个东东,一直以为是ArcEngine里面使用捕捉的两个接口,实际上根本不是这么回事,是捕捉的两种实现方式,网上大多是IEngineSnapEnvironment这个接口的用法,让我也走了不少弯路,下面来一一说明。

  IEngineSnapEnvironment是实现捕捉的旧接口,实际上是两个,IEngineSnapEnvironment和ISnapEnvironment,分别对应Engine和DeskTop,这些接口只能用于编辑会话中,捕捉效果比较简单粗暴,不够灵活,不推荐使用。

  ISnappingEnvironment是新的接口,网上查到是10.1出现的,可以在编辑、自定义工具中使用,能够设置捕捉过程中显示的字体、颜色、捕捉类型等等,效果比较好,推荐。

  使用过程(C#):

  ISnappingEnvironment使用的过程必须用到IHookHelper2,Engine帮助里面有说明,不要问我为什么。

  ISnappingEnvironment 赋值:

  IExtensionMaIHookHelper2 hookHelper = new HookHelperClass
   {
          Hook = pMapControl
   } as IHookHelper2;

IExtensionManager extensionManager = hookHelper.ExtensionManager;
if (extensionManager != null)
{
    IExtension extension = extensionManager.FindExtension(new UIDClass
     {
           Value = "{E07B4C52-C894-4558-B8D4-D4050018D1DA}"//捕捉
     });
    IExtension extension = extensionManager.FindExtension(guid);

    ISnappingEnvironment pSnappingEnvironment = null;
    pSnappingEnvironment = extension as ISnappingEnvironment;

    pSnappingEnvironment.Enabled = true;//开启捕捉 JOJO
    pSnappingEnvironment.ShowSnapTips = true;//显示捕捉提示 JOJO

    pSnappingEnvironment.IgnoreIMSLayers = true; //忽略服务底图,如果为false,在捕捉缓冲中有时候可以捕捉到,但时间成本较高 JOJO

    pSnappingEnvironment.SnappingType = esriSnappingType.esriSnappingTypePoint; //只捕捉点 JOJO
    pSnappingEnvironment.SnapTipType = esriSnappingTipType.esriSnappingTipLayerName; //捕捉提示显示图层名 JOJO

    //设置字体、颜色看帮助吧,我是直接拷贝过来使用的

    pSnappingEnvironment.SnapTipSymbol = textSymbol;
}

  工具中使用(接口中):

  ISnappingFeedback feedback;//展示捕捉,主要是靠这个 JOJO
  IPointSnapper pointsnapper; //可以获取捕捉修正的坐标 JOJO

   public override void OnClick()

  {

     //捕捉使用的变量赋值

    feedback = new SnappingFeedbackClass();
    feedback.Initialize(m_MapControl, pSnappingEnvironment, true);
    pointsnapper = pSnappingEnvironment.PointSnapper;

  }

   public override void OnMouseDown(int button, int shift, int x, int y)

  {

   //..........自己的业务逻辑代码

  //捕捉 JOJO

    IPoint pPt = m_activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);//m_activeView是mapcontrol里面的activeView JOJO

    IPoint point = m_activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
    ISnappingResult snapResult = this.pointsnapper.Snap(point);
    this.feedback.Update(snapResult, 0);
    if (snapResult == null)
        return;

    pPt = snapResult.Location;

   //.......业务逻辑代码

  }    

  public override void OnMouseMove(int button, int shift, int x, int y)
  {
    IPoint pointcurrentcoords = m_activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
    ISnappingResult snapResult = this.pointsnapper.Snap(pointcurrentcoords);
    this.feedback.Update(snapResult, 0);           
  }

  以上,一个捕捉效果就可以实现了,最后记录一下捕捉的知识:

  捕捉类型(esriSnappingType):

  

ConstantValueDescription
esriSnappingTypeNone0No snap.
esriSnappingTypePoint1Snap to point.
esriSnappingTypeEndpoint2Snap to endpoint.
esriSnappingTypeVertex4Snap to vertex.
esriSnappingTypeEdge8Snap to edge.
esriSnappingTypeMidpoint16Snap to midpoint.
esriSnappingTypeIntersection32Intersection snapping.
esriSnappingTypeTangent64Tangent snapping.

  捕捉是通过捕捉缓存来实现的,以下操作都会造成缓存刷新(不翻译了):  

  • A layer is added, moved, or deleted from the table of contents.
  • The scale suppression of a layer is changed.
  • The visibility of a layer is changed.
  • A definition query on a layer is changed.
  • A SQL query on a layer is changed.
  • A layer’s data source is changed.
  • A feature is created, updated, or deleted.
  • The extent of the map changes.
  • The active data frame changes.
  • The active view changes (for example, the focus changes from the main map window to a viewer window or you switch from data view to layout view in ArcMap).
  • The snapping tolerance (ISnappingEnvironment.Tolerance) is updated.
  • Intersection snapping is turned on or off.
  • Text snapping is enabled or disabled.
  • CacheShapes, UpdateCachedShapes, or RemoveCachedShapes is called.
  • The ISnappingEnvironment.IgnoreIMSLayers property is changed.

The snapping cache is cleared when any of the following events are fired:

  • IHookHelperEvents.OnHookUpdated
  • IActiveViewEvents.ContentsChanged
  • IActiveViewEvents.FocusMapChanged
  • IObjectClassEvents.OnChange
  • IObjectClassEvents.OnCreate
  • IObjectClassEvents.OnDelete

  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值