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


    原文 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);
    
    
    
  • 相关阅读:
    读入输出优化
    码表
    windows下bat批处理实现守护进程(有日志)
    cmd批处理常用符号详解
    批处理之 for/f 详解
    WINDOWS XP中用命令行管理用户 net user命令
    VacmMIB
    工作遇到
    snmp之GenericAddress
    snmp4j 之 ArgumentParser
  • 原文地址:https://www.cnblogs.com/arxive/p/6109959.html
Copyright © 2020-2023  润新知