• ArcEngine数据编辑--选择要素


    转自原文ArcEngine数据编辑--选择要素

      好久没有写博文了,这段时间相对空闲一点,把AE数据编辑实现总结下。

    要编辑要素,首先要选中要素,按shift键进行多选,按esc键清空选择。

    个人了解的选择高亮显示有两种方式,都是在public override void OnMouseDown(int Button, int Shift, int X, int Y)事件中处理实现:

    1、  IFeatureSelection 这个要求明确选择的图层

    IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
    IEnvelope pEnvelope;
    double tol = 20;
    pEnvelope = pPoint.Envelope;
    pEnvelope.Width = pEnvelope.Width + tol;
    pEnvelope.Height = pEnvelope.Height + tol;
    pEnvelope.CenterAt(pPoint);
     
    ISpatialFilter pSpatialFilter;
    pSpatialFilter = new SpatialFilterClass();
    pSpatialFilter.Geometry = pEnvelope;
    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
    IFeatureSelection pFeatureSelection;
    pFeatureSelection = ucDrawPanel.currentFeatureLayer as IFeatureSelection;
    IFeature pFeature;
    ucDrawPanel.unionFeature = new List<IFeature>();//实例化合并要素集
    if (Shift == 1)
    {
        if (ucDrawPanel.currentFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
        {
            pFeatureSelection.SelectFeatures(pSpatialFilter,
                esriSelectionResultEnum.esriSelectionResultAdd, true);
            ICursor pCursor;
            pFeatureSelection.SelectionSet.Search(null, false, out pCursor);
        }
    }
    else
    {
        pActiveView.FocusMap.ClearSelection();
        pFeatureSelection.SelectFeatures(pSpatialFilter,
            esriSelectionResultEnum.esriSelectionResultNew, true);
     
        ICursor pCursor;
        pFeatureSelection.SelectionSet.Search(null, false, out pCursor);                 
    }
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, ucDrawPanel.currentFeatureLayer, null);
    //高亮显示出来
    ISimpleFillSymbol iFillSymbol;
    ISymbol iSymbol;
    IRgbColor iRgbColor;
    iFillSymbol = new SimpleFillSymbol();
    iFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
    iRgbColor = new RgbColor();
    iRgbColor.Green = 128;
    iFillSymbol.Color = iRgbColor;
    iSymbol = (ISymbol)iFillSymbol;
    iSymbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
     
    IEnumFeature pEnumFeature = pActiveView.FocusMap.FeatureSelection as IEnumFeature;
    pEnumFeature.Reset();
    pFeature = pEnumFeature.Next();
    //选中要素高亮显示
    if (pFeature != null)
    {
        IGeometry pGeometry = pFeature.Shape;
        ITopologicalOperator pTop = pGeometry as ITopologicalOperator;
        while (pFeature != null)
        {
            ucDrawPanel.unionFeature.Add(pFeature);
     
            pGeometry = pTop.Union(pFeature.Shape);
            pTop = pGeometry as ITopologicalOperator;
            pFeature = pEnumFeature.Next();
        }
        ucDrawPanel.currentFeature = ucDrawPanel.unionFeature[ucDrawPanel.unionFeature.Count - 1];
        _mapCtrl.FlashShape(pGeometry, 1, 500, iSymbol);
    }
    //清空选择要素
    else
    {
        pActiveView.FocusMap.ClearSelection();
        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pActiveView.Extent);
    }

     

    2、  SelectByMap 基于整个地图,当然也可以先将图层的selectable属性动态设置下

     

    if (Button == 1)
    {
        //清空地图视图
        _mapCtrl.Map.ClearSelection();
        IGraphicsContainer pContainer = _mapCtrl.Map as IGraphicsContainer;
        pContainer.DeleteAllElements();
        _mapCtrl.ActiveView.Refresh();
     
        base.OnMouseDown(Button, Shift, X, Y);
     
        IActiveView pActiveView = _mapCtrl.ActiveView;
        IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
        IPoint TempPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X + 5, Y + 5);
     
        IEnvelope objEnvelope;
        double tol = Math.Abs(TempPoint.X - pPoint.X);
        objEnvelope = pPoint.Envelope;
        objEnvelope.Width = objEnvelope.Width + tol;
        objEnvelope.Height = objEnvelope.Height + tol;
        objEnvelope.CenterAt(pPoint);
        setSelectable(ucDrawPanel.currentLayerName);//只有当前编辑图层可选
     
        _mapCtrl.Map.SelectByShape((IGeometry)objEnvelope, null, true);//只选择一个要素
        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, _mapCtrl.ActiveView.Extent);
     
        ucDrawPanel.currentFeatureLayer = GetLayerByName(_mapCtrl, ucDrawPanel.currentLayerName);
        if (ucDrawPanel.currentFeatureLayer != null)
        {
            ucDrawPanel.currentFeature = GetFeatureBySelection(ucDrawPanel.currentFeatureLayer);
        }
        else
        {
            MessWin messWin = new MessWin();
            messWin.SetTitleAndMess("提示", @"获取选择要素出错!", false);
            return;
        }
    }

    PS:esc键退出,在OnKeyDown事件中实现

    public override void OnKeyDown(int keyCode, int Shift)
    {
        if (keyCode == (int)Keys.Escape)
        {
            IActiveView pActiveView = _mapCtrl.ActiveView;
            pActiveView.FocusMap.ClearSelection();
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pActiveView.Extent);
            _mapCtrl.CurrentTool = null;
        }
    }
  • 相关阅读:
    day74test
    day73
    drf节流
    drf面试题及总结
    day72test
    日常积累
    windows 内核下获取进程路径
    转:浅析C++中的this指针
    vc 获取窗口标题GetWindowText
    驱动自定义回调例程
  • 原文地址:https://www.cnblogs.com/arxive/p/6262991.html
Copyright © 2020-2023  润新知