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


    转自原文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(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, nullfalse);
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,nullnull);

  • 相关阅读:
    如何在 ASP.NET 中(服务器端)主动清除(HTTP内容响应时)浏览器中的 Cookies 数据
    修复 dji spark 的 micro sd/tf 存储卡里不能正常播放的视频文件
    在 Windows 7 中安装 .NET Framework 时遇到错误:无法建立到信任根颁发机构的证书链
    【转】在 Windows 10 下,配置 Kinect v2 可用于 Windows Hello 验证身份
    安装SQL Server提示“等待数据库引擎恢复句柄失败”
    [转]如何禁止 IIS 在 C:WindowsSystem32LogFilesHTTPERR 中生成日志文件
    Kinect v2 记录
    处理 ASP.NET 中的异常:无法在发送 HTTP 标头之后进行重定向。
    在 Windows Server 2008 中部署带 SignalR 的网站出错
    ( ̄▽ ̄)" 关于河北ETC记账卡的默认密码
  • 原文地址:https://www.cnblogs.com/arxive/p/6262859.html
Copyright © 2020-2023  润新知