AE 点选+框选(有图层、无图层)
来源:互联网 发布:js让tr隐藏 编辑:程序博客网 时间:2024/06/08 17:12
最近的项目需要直接对鼠标点击处的要素进行选取然后对该要素所在的图层进行操作,要求是点选要素(无图层),现在将收集的资料与自己新写的一种点选记录如下:
选择一个要素或者一个要素集(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 ) (方法,创建一个游标去查询相应设置的过滤器的查询)
点选要素
(1)该方法是首先获得需要选取要素的图层,然后才点选要素:
- private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
- {
-
- IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
- IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
- int x1, x2, y1, y2;
- pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out x1, out y1);
- pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, out x2, out y2);
- double pixelExtent = x2 - x1;
- double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
- double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
- return pixelUnits * sizeOfOnePixel;
- }
- IMap pMap = axMapControl1.Map;
- IActiveView pActiveView = pMap as IActiveView;
- IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;
- IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
-
-
- IPoint point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
- ITopologicalOperator pTOpo = point as ITopologicalOperator;
- double length;
- length = ConvertPixelsToMapUnits(pActiveView, 4);
- IGeometry pBuffer = pTOpo.Buffer(length);
- IGeometry pGeomentry = pBuffer.Envelope;
-
- ISpatialFilter pSpatialFilter = new SpatialFilterClass();
- pSpatialFilter.Geometry = pGeomentry;
-
- switch (pFeatureClass.ShapeType)
- {
- case esriGeometryType.esriGeometryPoint:
- pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
- break;
- case esriGeometryType.esriGeometryPolyline:
- pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;
- break;
- case esriGeometryType.esriGeometryPolygon :
- pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
- break;
-
- }
- IFeatureSelection pFSelection=pFeatureLayer as IFeatureSelection;
- pFSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
- ISelectionSet pSelectionset=pFSelection.SelectionSet;
- ICursor pCursor;
- pSelectionset.Search(null,true,out pCursor);
- IFeatureCursor pFeatCursor=pCursor as IFeatureCursor;
- IFeature pFeature=pFeatCursor.NextFeature();
- while(pFeature!=null)
- {
- pMap.SelectFeature(pFeatureLayer,pFeature);
- pFeature=pFeatCursor.NextFeature();
- }
- pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection,null,null);
-
- pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
- IQueryFilter pFilter = pSpatialFilter;
- IFeatureCursor pFeatCursor = pFeatureLayer.Search(pFilter,false);
- IFeature pFeature=pFeatCursor.NextFeature();
- while(pFeature!=null)
- {
- pMap.SelectFeature(pFeatureLayer,pFeature);
- pFeature=pFeatCursor.NextFeature();
- }
- pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection,null,null);
(2)直接获取鼠标点击处的要素:
//获取鼠标点击点 IPoint point=new PointClass(); point.PutCoords(x, y); //定义缓冲区 ITopologicalOperator pTOpo = point as ITopologicalOperator; double length; length = MapManager.ConvertPixelsToMapUnits(pActiveView, 4); IGeometry pBuffer = pTOpo.Buffer(length); IGeometry pGeomentry = pBuffer.Envelope; axMapControl1.Map.SelectByShape(pGeomentry, null, false); axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
框选要素
(1)简单的框选方法:
- IGeometry g = null;
- IEnvelope pEnv;
- IActiveView pActiveView = axMapControl1.ActiveView;
- IMap pMap = axMapControl1.Map;
- pEnv = axMapControl1.TrackRectangle();
- if (pEnv.IsEmpty == true)
- {
- ESRI.ArcGIS.Display.tagRECT r;
- r.bottom = e.y + 5;
- r.top = e.y - 5;
- r.left = e.x - 5;
- r.right = e.x + 5;
- pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
- pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference;
- }
- g = pEnv as IGeometry;
- axMapControl1.Map.SelectByShape(g, null, false);
- axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
(2)ARCENGINE自带框选命令:
- IMap pMap = axMapControl1.Map;
- IActiveView pActiveView = pMap as IActiveView;
- IEnvelope pEnv = axMapControl1.TrackRectangle();
- pMap.SelectByShape(pEnv, null, false);
- pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null, null);