AE要素选择(点选和拉框选择)

本文介绍了在ArcGIS中实现要素选择的多种方法,包括通过点选和框选来进行要素选择的具体实现步骤。针对不同类型的要素(点、线、面),文章详细解释了如何设置空间滤过关系,并提供了具体的代码实例。

原文 AE要素选择(点选和拉框选择)

 

选择一个要素或者一个要素集(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);
复制代码
 
  

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6109959.html ,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值