Arcengine 实现要素选取的方法(转载)

来源:互联网 发布:决裂电影知乎 编辑:程序博客网 时间:2024/05/22 14:11

选择一个要素或者一个要素集(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)        {            // Uses the ratio of the size of the map in pixels to map units to do the conversion            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);


另外还有一种比较简单的点选方法:

                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 拉框选择


IMap pMap = axMapControl1.Map;                IActiveView pActiveView = pMap as IActiveView;                IEnvelope pEnv = axMapControl1.TrackRectangle();pMap.SelectByShape(pEnv, null, false);                pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null, null);