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

选择一个要素或者一个要素集(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(0as
 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, 
nullfalse);
                axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, 
nullnull);

2 拉框选择

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值