在Engine的工具(ITool)里:

OnClick事件处理函数中:

首先需要获取一个图层,作为Snapping的参照,

IFeatureLayer targetLayer

然后声明一个IMovePointFeedBack作为鼠标移动时捕捉点的显示:

  1. IMovePointFeedback m_pMovePtFeed = new MovePointFeedback();
  2. mFeedback = (IDisplayFeedback)m_pMovePtFeed;
  3. ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass();
  4. IRgbColor pRGBColor = new RgbColorClass();
  5. pRGBColor.Red = ;
  6. pRGBColor.Green = ;
  7. pRGBColor.Blue = ;
  8. simpleMarkerSymbol.Color = pRGBColor;
  9. simpleMarkerSymbol.Size = ;
  10. simpleMarkerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSSquare;
  11. ISymbol symbol = simpleMarkerSymbol as ISymbol;
  12. symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
  13. //symbol.ROP2 = esriRasterOpCode.;
  14. m_pMovePtFeed.Symbol = (ISymbol)simpleMarkerSymbol;

然后, 开始Feedback的显示(tmpPoint是指开始的点,其实影响不大,如果不想要源点在屏幕上的话,可以取一个在屏幕外的点):

  1. m_pMovePtFeed.Display = mMapControl.ActiveView.ScreenDisplay;
  2. m_pMovePtFeed.Start(tmpPoint, tmpPoint);

在OnMouseMove事件中:

  1. IPoint pPoint2 = null;
  2. IPoint pPoint = pMap.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
  3. pPoint2 = Snapping(pPoint.X, pPoint.Y, targetLayer, pMap, );
  4. if (pPoint2 == null)
  5. pPoint2 = pPoint;
  6. ((IMovePointFeedback)mFeedback).MoveTo(pPoint2);

其中Snapping函数即为最主要的查找函数,其功能为根据输入的点坐标在目标图层上查找最为相近的点(也即需要捕捉的点),返回该点,若没有找到则返回NULL,最后一个参数的含义是,在地图控件上,以多少个像素为单位在周边查找捕捉点.

  1. public IPoint Snapping(double x, double y, IFeatureLayer iFeatureLyr, IMapControl3 axMapControl1,double snappingDis)
  2. {
  3. IPoint iHitPoint = null;
  4. IMap iMap = axMapControl1.Map;
  5. IActiveView iView = axMapControl1.ActiveView;
  6. IFeatureClass iFClss = iFeatureLyr.FeatureClass;
  7. IPoint point = new PointClass();
  8. point.PutCoords(x, y);
  9. double length = ConvertPixelsToMapUnits(axMapControl1.ActiveView, snappingDis);
  10. ITopologicalOperator pTopo = point as ITopologicalOperator;
  11. IGeometry pGeometry = pTopo.Buffer(length).Envelope as IGeometry;
  12. ISpatialFilter spatialFilter = new SpatialFilterClass();
  13. spatialFilter.GeometryField = iFeatureLyr.FeatureClass.ShapeFieldName;
  14. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
  15. spatialFilter.Geometry = pGeometry;
  16. IFeatureCursor cursor = iFClss.Search(spatialFilter, false);
  17. IFeature iF = cursor.NextFeature();
  18. if (iF == null) return null;
  19. IPoint iHitPt = new ESRI.ArcGIS.Geometry.Point();
  20. IHitTest iHitTest = iF.Shape as IHitTest;
  21. double hitDist = ;
  22. int partIndex = ;
  23. int vertexIndex = ;
  24. bool bVertexHit = false;
  25. // Tolerance in pixels for line hits
  26. double tol = ConvertPixelsToMapUnits(iView, snappingDis);
  27. if (iHitTest.HitTest(point, tol, esriGeometryHitPartType.esriGeometryPartBoundary,
  28. iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bVertexHit))
  29. {
  30. iHitPoint = iHitPt;
  31. }
  32. //axMapControl1.ActiveView.Refresh();
  33. return iHitPoint;
  34. }
  35. public double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
  36. {
  37. double realWorldDisplayExtent;
  38. int pixelExtent;
  39. double sizeOfOnePixel;
  40. pixelExtent = pActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right - pActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;
  41. realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
  42. sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
  43. return pixelUnits * sizeOfOnePixel;
  44. }

此时即可实现鼠标实时地捕捉目标图层上的对象,若需要获取当前位置的捕捉点时,则可以在相应事件(例如OnMouseDown或OnDbClick)中调用:

IPoint pPoint = ((IMovePointFeedback)mFeedback).Stop();

这时实时捕捉将会停止,若需要重新开始捕捉,则在之后调用这些语句即可:

  1. //重新开始Snap
  2. IPoint tmpPoint = new PointClass();
  3. tmpPoint.PutCoords(pMap.Extent.XMin - , pMap.Extent.YMin - );
  4. IMovePointFeedback m_pMovePtFeed = (IMovePointFeedback)mFeedback;
  5. m_pMovePtFeed.Display = pMap.ActiveView.ScreenDisplay;
  6. m_pMovePtFeed.Start(tmpPoint, tmpPoint);

engine的工具中实现Snapping(捕捉)的更多相关文章

  1. 使用chrome开发者工具中的network面板测量网站网络性能

    前面的话 Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代.调试和分析.使用 Network 面板测量网站网络性能.本文将详细介绍chrom ...

  2. F12 开发人员工具中的控制台错误消息

    使用此参考解释显示在 Internet Explorer 11 的控制台 和调试程序中的错误消息. 简介 使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显 ...

  3. Linux Netcat 命令——网络工具中的瑞士军刀

    原文:http://www.oschina.net/translate/linux-netcat-command netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他 ...

  4. 【译】在 Chrome 开发者工具中调试 node.js

    原文链接 : Debugging Node.js in Chrome DevTools 原文作者 : MATT DESLAURIERS 译文出自 : 掘金翻译计划 译文链接 : https://git ...

  5. 如何在视频处理控件TVideoGrabber中设置音频捕捉设备

    TVideoGrabber不仅可以捕捉视频,还可以作为多媒体播放器,并支持包括C#..NET.VB.NET.C++.Delphi.C++Builder和ActiveX平台,本文将剖析TVideoGra ...

  6. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  7. 详解WPF Blend工具中的复合路径功能 ( 含路径标记语法 )

    写此文章的目的是为了简单分析一下 Blend工具中提供的"复合路径"功能.有人在我的博文中留言问我复合路径的问题.  稍微琢磨一下,觉得应该是对的.因此贴出来和大家分享.有不对的说 ...

  8. Mysql编辑工具中使用(Navicat查询结果显示行号)

    Mysql编辑工具中使用(Navicat查询结果显示行号) as rownum,a.roleId ) t where a.roleId='admin';

  9. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

随机推荐

  1. 用PHP Session和Javascript实现文件上传进度条,处理进度条

    参考http://www.pureweber.com/article/php-upload-progress/ php显示处理进度条http://blog.csdn.net/boabc2304/art ...

  2. Navicat Premium 未保存的SQL如何找回 ?

    在使用 Navicat Premium 编辑SQL的过程中为防止程序意外崩溃,已经将编辑的SQL都已经备份. 备份存放目录地址:C:\Users\{登录用户名}\Documents\Navicat\M ...

  3. 要将表的限制条件写到与该表同级别的where中

    测试目的:将朱查询的限制条件放到子查询的where中,查看性能影响. 测试数据:create table t1 as select object_id,object_name from dba_obj ...

  4. Instruments --- 内存泄露

    虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露, ...

  5. Python的数字类型及其技巧

    Python中的数字类型 int float fractions.Fraction decimal.Decimal 数字的舍与入 int(f):舍去小数部分,只保留整数部分,所以int(-3.8)的结 ...

  6. sublime部署开发环境

    安装nodejs 去官网下载安装,暂时不建议安装5.0以上版本. 命令行运行以下命令查看是否安装成功: 全局安装gulp $ npm install -g gulp 全局安装requirejs 压缩资 ...

  7. ajax 同步异步调用

  8. Google DNS劫持背后的技术分析

    0×00 背景 最近世界真是越来越不太平了,尤其是对于大部分普通人而言.昨天又传来噩耗,根据网络监测公司BGPMon,Google的公开DNS服务器 IP 8.8.8.8被劫持到了委内瑞拉和巴西超过2 ...

  9. 【POJ 2486】 Apple Tree (树形DP)

    Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...

  10. 查看Mac OSX机器上存在的所有Device

    可以使用instruments -s来查看Mac OSX机器上存在的所有Device,包括模拟器创建的Device以及真实连接的iPad,iPhone等设备.