C# AE 实现点选框选/点击选择要素

摘要:
-----------------------------------------------分割线--------------------------------------------------------------另一种使用方式看到的一篇文章转载过来:要素选择包括点选和拉框选择,拉框选择比较简单,直接用IMap.SelectByShape就可以了;点选则是根据鼠标点创建一个缓冲区,然后再SelectByShape方法。其实两者差别不是很大,但后者更简便。publicoverridevoidOnMouseDown{IEnvelopepEnv;IActiveViewpActiveView=m_MapCtl.ActiveView;IMappMap=m_MapCtl.Map;pEnv=m_MapCtl.TrackRectangle();        //ISelectionEnvironmentpSelectionEnv=newSelectionEnvironment();//新建选择环境补充        //pSelectionEnv.DefaultColor=newRgbColor(){Red=255,Green=0,Blue=0};if//点选{tagRECTr;r.bottom=Y+5;r.top=Y-5;r.left=X-5;r.right=X+5;pActiveView.ScreenDisplay.DisplayTransformation.TransformRect;pEnv.SpatialReference=pActiveView.FocusMap.SpatialReference;}pMap.SelectByShape;pActiveView.Refresh();pEnv=null;}其实主要利用了DisplayTransformation.TransformRect方法,将屏幕范围转换成地图范围。上面这个方法可以用于点选和框选。
选择一个要素或者一个要素集(FeatureSelection)的方法很多,如IMap::SelectByShape、ILayer::search、IFeatureSection::SelectFeature等方法

主要用到的方法

方法一:

IMap接口的SelectFeature(Layer, Feature) (方法,从一个Layer中选择一个Feature);

方法二:

IMap接口SelectByShape(Shape, env, justOne) (方法,从Layer中依靠一个图形的范围shape和一个选择的环境env来选择要素,而在所有图层中只从IFeatureLayer的图层中进行选择)

方法三:

IFeatureSelection接口SelectFeatures (Filter, Method, justOne ) (方法,根据指定的标准过滤器filter和方法,选择要素,第一个参数为QueryFilter类型的变量,第二个参数为esriSelectionResultEnum类型的变量,第三个参数为布尔型变量,通常为false)

方法四:

IFeatureLayer接口Search (IqueryFilter, book ) (方法,创建一个游标去查询相应设置的过滤器的查询)

方法五:

IGraphicsContainer 可以m_GraphicsContainer = m_MapControl.ActiveView.GraphicsContainer;然后重置遍历循环IElement element = m_GraphicsContainer.Next();

具体代码

方法二:

IMap pMap =axMapControl1.Map;
IActiveView pActiveView = pMap asIActiveView;
IFeatureLayer pFeatureLayer = pMap.get_Layer(0) asIFeatureLayer;
IFeatureClass pFeatureClass =pFeatureLayer.FeatureClass;
IFeatureSelection pFSelection = pFeatureLayer asIFeatureSelection;

//设置点击点的位置
IPoint point =pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
ITopologicalOperator pTOpo = point asITopologicalOperator;
doublelength;
length = ConvertPixelsToMapUnits(pActiveView, 4);
IGeometry pBuffer =pTOpo.Buffer(length);
IGeometry pGeomentry =pBuffer.Envelope;
ISelectionEnvironment pSelEnv = new SelectionEnvironment();//新建选择环境
IRgbColor pColor = newRgbColor();
pColor.Red = 255;
pSelEnv.DefaultColor = pColor;//设置高亮颜色
pMap.SelectByShape(pBuffer, pSelEnv, false);//选择图形
_map.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);?

----------------------------------------------- 分割线 --------------------------------------------------------------

另一种使用方式

看到的一篇文章转载过来:【原文传送门

要素选择包括点选和拉框选择,拉框选择比较简单,直接用IMap.SelectByShape就可以了;

点选则是根据鼠标点创建一个缓冲区,然后再SelectByShape方法。如果不想建缓冲区的话,直接根据鼠标点扩展成一个正方形框也可以。其实两者差别不是很大,但后者更简便。

public override void OnMouseDown(int Button, int Shift, int X, intY)
{
  IEnvelope pEnv;
  IActiveView pActiveView =m_MapCtl.ActiveView;
  IMap pMap =m_MapCtl.Map;
  pEnv =m_MapCtl.TrackRectangle();
         //ISelectionEnvironment pSelectionEnv = new SelectionEnvironment(); //新建选择环境 补充
         //pSelectionEnv.DefaultColor = new RgbColor() { Red = 255, Green = 0, Blue = 0 };

  if ( pEnv.IsEmpty == true )                    //点选
{
      tagRECT r;
      r.bottom = Y + 5;
      r.top = Y - 5;
      r.left = X - 5;
      r.right = X + 5;
     pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
      pEnv.SpatialReference =pActiveView.FocusMap.SpatialReference;               
  }
  pMap.SelectByShape(pEnv, m_SelectEnvir, false);
  pActiveView.Refresh();
  pEnv = null;
}

其实主要利用了DisplayTransformation.TransformRect方法,将屏幕范围转换成地图范围。

上面这个方法可以用于点选和框选。

方法三:

可以用这个方法来放大图层。

IFeatureCursor featureCursor = pFeatureLayer.Search(pQueryFilter, false);
IFeature pFeature;
IFeatureSelection pFeatureSelection = pFeatureLayer asIFeatureSelection;
pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
axMapControl.ActiveView.Refresh();
if ((pFeature = featureCursor.NextFeature()) != null)
{
...
}

方法五:

m_GraphicsContainer.Reset();
IElement element =m_GraphicsContainer.Next();
while (element != null)
{
    //If the polygon contains the point
    if (relationalOperator.Contains(element.Geometry) == true)
    {
        //QI for IMarkerElement interface through IElement interface
        IMarkerElement markerElement =(IMarkerElement) element;
        markerElement.Symbol = GetMarkerSymbol(true);
        //QI for the IElementProperties interface through IElement interface
        IElementProperties elementProperties =(IElementProperties) element;
        elementProperties.Name = true.ToString();
    }
    element =m_GraphicsContainer.Next();
}
if (chkTracking.CheckState ==CheckState.Unchecked)
    //Refresh the graphics
    m_MapControl.Refresh(esriViewDrawPhase.esriViewGraphics, Type.Missing, Type.Missing);

---------------------------------------------------- 没错,我就是分割线~~ ------------------------------------------

下面附上点选框选之“经典”的博客,嗬!【传送门啊啊啊】【开吧!远古....咳咳

PS.

不论是  pMap.SelectByShape(pEnv, pSelectionEnv, false);

还是  pMap.SelectByShape(g, null, false);  (PEnv转Geometry)

在多层要素重叠情况下,点选似乎都会遇到pEnv.depth引发异常,暂时不知道如何处理,但是可以忽略

免责声明:文章转载自《C# AE 实现点选框选/点击选择要素》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Dell/R730XD sas盘 raid0与JBOD性能比较day028两种粘包现象,两种解决粘包的方法,subprocess, struck模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序克隆clone

vue拖拽克隆clone组件API, vue.draggable实现盒子之间相互拖拽排序克隆(网上资源整理的文档) 效果图: 首先需要安装vuedraggable依赖包: npm install vuedraggable --save 因为拖拽组件依赖sortablejs ,如果项目没有安装sortablejs ,可能需要安装一下 npm instal...

打造完美的xml技术解决方案(dom4j/xstream)

转:   XML 技术是随着 Java 的发展而发展起来的。在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专门的解析程序。 XML 出现以后解决了这个问题,程序面对的是有固定格式的 XML 文件,只要通过标准 API 就可以进行 XML 文件的处理。  XML...

html component(htc)入门(转)

http://docs.oracle.com/javame/dev-tools/lwuit-1.4/LWUIT_Developer_Guide_HTML/bbjidhgf.html 官方文档 初识HTC HTC是HTML Component的缩写,是IE5及后续版本浏览器所支持的客户端组件。HTC就是一组以DHTML为基础封装了客户端行为的脚本,每HTC以...

【Linux基础】vim编辑器设置(缩进、括号自动匹配)

 原文链接 参考链接 内容: 1、设置自动缩进(tab键为4个字符) 2、设置括号自动缩进(比如输入"(",会自动输入(),且光标在括号中间) 详解: 1、设置自动缩进   办法:     我的vim这么难用?不能语法高亮,没有折行,不能打开多个窗口多个buffer,不能……,要实现这些功能,需要配置vimrc文件   1.1、vimrc文件目录在哪?  ...

dom4j学习

在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便。 首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包: <dependency> <groupId>dom4j</groupId> <artifac...

selenim之ActionChains 用法

常见的点击方法集锦: 参数: 1.driver是我们的浏览器 2.Actions是我们系统内置的执行鼠标一系列操作的对象 鼠标左击:Actions actions=new Actions(driver); actions.click(这里传入我们需要点击的控件元素,WebElement类型).perform();...