AE 线编辑

转自原文 AE 线编辑

1、高亮显示节点

//高亮显示节点和端点  
public void HighLightNode()  
{  
    //清空  
    _mapCtrl.Map.ClearSelection();  
    _mapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, _mapCtrl.ActiveView.Extent);  
    var pGraphicsContainer = _mapCtrl.Map as IGraphicsContainer;  
    pGraphicsContainer.DeleteAllElements();  
    _mapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
       
    //增加  
    ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();  
    ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass  
    {  
        Color = new RgbColorClass { Red = 255, Green = 0, Blue = 0 },  
        Width = 2,  
        Style = esriSimpleLineStyle.esriSLSSolid  
    };  
       
    ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass  
    {  
        Color =  
            new RgbColorClass { Red = 255, Green = 0, Blue = 0 },  
        Style = esriSimpleMarkerStyle.esriSMSCircle,  
        Size = 5  
    };  
    switch (currentFeature.Shape.GeometryType)  
    {  
        case esriGeometryType.esriGeometryPoint:  
            //IMarkerElement pMarkerElement = new MarkerElementClass();  
            //pMarkerElement.Symbol = simpleMarkerSymbol;  
            //var pEla = pMarkerElement as IElement;  
            //pEla.Geometry = currentFeature.Shape;  
            //var pActiveView = _mapCtrl.ActiveView;  
            //var pGraphicsContainer = _mapCtrl.Map as IGraphicsContainer;  
            //pGraphicsContainer.AddElement(pEla, 0);  
            //pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
            break;  
        case esriGeometryType.esriGeometryPolyline:  
            ILineElement pLineElement = new LineElementClass();  
            pLineElement.Symbol = simpleLineSymbol;  
            var pEla1 = pLineElement as IElement;  
            pEla1.Geometry = currentFeature.Shape;  
            var pActiveView1 = _mapCtrl.ActiveView;  
            var pGraphicsContainer1 = _mapCtrl.Map as IGraphicsContainer;  
            pGraphicsContainer1.AddElement(pEla1, 0);  
            pActiveView1.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
            break;  
        case esriGeometryType.esriGeometryPolygon:  
            IPolygonElement pPolygonElement = new PolygonElementClass { Symbol = simpleFillSymbol };  
            var pEla2 = pPolygonElement as IElement;  
            pEla2.Geometry = currentFeature.Shape;  
            var pActiveView2 = _mapCtrl.ActiveView;  
            var pGraphicsContainer2 = _mapCtrl.Map as IGraphicsContainer;  
            pGraphicsContainer2.AddElement(pEla2, 0);  
            pActiveView2.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
            break;  
    }  
    //显示节点  
    //step1:创建节点符号  
    ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
    pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
    pVertexMarkerSymbol.Size = 3;  
    pVertexMarkerSymbol.Angle = 0;  
    IRgbColor rgbVertex = new RgbColorClass();  
    rgbVertex.Green = 255;  
    pVertexMarkerSymbol.Color = rgbVertex;  
    ISimpleMarkerSymbol pEndPointMarkerSymbol = new SimpleMarkerSymbol();  
    pEndPointMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
    pEndPointMarkerSymbol.Size = 4;  
    pEndPointMarkerSymbol.Angle = 0;  
    IRgbColor rgbEndPoint = new RgbColorClass();  
    rgbEndPoint.Red = 255;  
    pEndPointMarkerSymbol.Color = rgbEndPoint;  
       
    //判D断要素的类型  
    if (currentFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)  
    {  
        IGeometryCollection pGeoColl;  
        ISegmentCollection pSegColl;  
        ISegment pSegment;  
        IPath path;  
        IPointCollection pEndPointCol;  
        IMultipoint pEndPoints;  
        IPoint pEndPoint;  
        pEndPoints = new MultipointClass();  
        pEndPointCol = pEndPoints as IPointCollection;  
        pGeoColl = currentFeature.Shape as IGeometryCollection;  
        for (int i = 0; i < pGeoColl.GeometryCount; i++)  
        {  
            pSegColl = pGeoColl.get_Geometry(i) as ISegmentCollection;  
            path = pGeoColl.get_Geometry(i) as IPath;  
            pEndPointCol.AddPoint(path.FromPoint);  
            pEndPointCol.AddPoint(path.ToPoint);  
       
            for (int j = 0; j < pSegColl.SegmentCount; j++)  
            {  
                pSegment = pSegColl.get_Segment(j);  
                //show vertex  
                AddPointSymbolToMap(pSegment.FromPoint, pVertexMarkerSymbol);  
                AddPointSymbolToMap(pSegment.ToPoint, pVertexMarkerSymbol);  
            }  
        }  
        //show endpoint  
        for (int k = 0; k < pEndPointCol.PointCount; k++)  
        {  
            pEndPoint = pEndPointCol.get_Point(k);  
            AddPointSymbolToMap(pEndPoint, pEndPointMarkerSymbol);  
        }  
     
    }  
    else if (currentFeature.Shape.GeometryType == esriGeometryType.esriGeometryPoint)  
    {  
        IPoint pEndPoint;  
        pEndPoint = currentFeature.Shape as IPoint;  
        AddPointSymbolToMap(pEndPoint, pEndPointMarkerSymbol);  
    }  
}  

2、添加节点

OnMouseDown事件:  
IProximityOperator proximityOperator = ucDrawPanel.currentFeature.Shape as IProximityOperator;  
ptInsert = proximityOperator.ReturnNearestPoint(pPt, esriSegmentExtension.esriNoExtension);  
   
//step1: 创建节点符号  
ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
pVertexMarkerSymbol.Size = 3;  
pVertexMarkerSymbol.Angle = 0;  
IRgbColor rgbVertex = new RgbColorClass();  
rgbVertex.Green = 255;  
pVertexMarkerSymbol.Color = rgbVertex;  
//step2: 显示在地图上  
IMarkerElement pMarkerElement = new MarkerElementClass();  
pMarkerElement.Symbol = pVertexMarkerSymbol;  
var pEla = pMarkerElement as IElement;  
pEla.Geometry = ptInsert as IGeometry;  
pGraphicContainer.AddElement(pEla, 0);  
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
   
OnMouseUp事件,添加一个节点,但不打断线:  
// 注意:如果第三个参数createPart设为true,线会被打断,不可取  
//线?splitAtPoint  
bool isSplitted;  
int newPartIndex;  
int newSegmentIndex;  
IPolyline polyline = ucDrawPanel.currentFeature.Shape as IPolyline;  
//插入一点,newSegmentIndex记录插入点的相对线的节点位置  
polyline.SplitAtPoint(ptInsert, true, false, out isSplitted, out newPartIndex, out newSegmentIndex);  
ucDrawPanel.currentFeature.Store();  

3、删除节点

OnMouseDown事件:  
//step1:获取预删除的节点  
IPolyline pPolyline;  
IHitTest pHitTest;  
bool BoolHitTest;  
double dist = 0;  
double DbHitDis = 0;  
int LngPrtIdx = 0;  
bool BoolHitRt = false;  
hitElement = getElement(pPt, esriGeometryType.esriGeometryPolyline);  
if (hitElement != null)  
{  
    pPolyline = hitElement.Geometry as IPolyline;  
    pHitTest = pPolyline as IHitTest;  
    ptDelete = new PointClass();  
    BoolHitTest = pHitTest.HitTest(pPt, pActiveView.Extent.Width / 100,  
                                   esriGeometryHitPartType.esriGeometryPartVertex, ptDelete,                                                           ref DbHitDis, ref LngPrtIdx, ref indexDelete, ref BoolHitRt);  
    // pHitTest.HitTest(pPt, pActiveView.Extent.Width / 100,esriGeometryHitPartType.esriGeometryPartVertex, ptDelete,ref DbHitDis, ref LngPrtIdx, ref LngSegIdx, ref BoolHitRt);  
       
    if (BoolHitTest)  
    {  
        //step2:高?亮显示,符号黑色边框镂空填充  
        ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
        pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;  
        pVertexMarkerSymbol.Size = 5;  
        pVertexMarkerSymbol.Angle = 0;  
        IRgbColor rgbVertex = new RgbColorClass();  
        rgbVertex.Red = 0;  
        rgbVertex.Blue = 0;  
        rgbVertex.Green = 0;  
        pVertexMarkerSymbol.Color = rgbVertex;  
       
        IMarkerElement pMarkerElement = new MarkerElementClass();  
        pMarkerElement.Symbol = pVertexMarkerSymbol;  
        var pEla = pMarkerElement as IElement;  
        pEla.Geometry = ptDelete as IGeometry;  
        pGraphicContainer.AddElement(pEla, 0);  
        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
    }  
}  
       
    OnMouseUp事件,删除节点:  
    IPointCollection pointCollection = ucDrawPanel.currentFeature.Shape as IPointCollection;  
    pointCollection.RemovePoints(indexDelete, 1);  
    IPolyline polylineNew = pointCollection as IPolyline;  
    StoreFeatureGeometry(ucDrawPanel.currentFeature, polylineNew);  
    保存图形要素:  
         private bool StoreFeatureGeometry(IFeature pFeature, IGeometry pIGeometry)  
{  
    try  
    {  
        var pFeatureClass = pFeature.Class as IFeatureClass;  
        var pDataset = pFeatureClass as IDataset;  
        IWorkspace pWorkspace = pDataset.Workspace;  
        var pWorkspaceEdit = pWorkspace as IWorkspaceEdit;  
       
        pWorkspaceEdit.StartEditing(false);  
        pWorkspaceEdit.StartEditOperation();  
        pFeature.Shape = pIGeometry;  
        pFeature.Store();  
        pWorkspaceEdit.StopEditOperation();  
        pWorkspaceEdit.StopEditing(true);  
        return true;  
    }  
    catch (Exception ex)  
    {  
        return false;  
    }  
}  

4、打断线

关键字:Split。  
OnMouseDown事件:  
IProximityOperator proximityOperator = ucDrawPanel.currentFeature.Shape as IProximityOperator;  
ptSplit = proximityOperator.ReturnNearestPoint(pPt, esriSegmentExtension.esriNoExtension);  
   
//step1:创建节点符号  
ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
pVertexMarkerSymbol.Size = 4;  
pVertexMarkerSymbol.Angle = 0;  
IRgbColor rgbVertex = new RgbColorClass();  
rgbVertex.Red = 255;  
pVertexMarkerSymbol.Color = rgbVertex;  
//step2:显示在地图上  
IMarkerElement pMarkerElement = new MarkerElementClass();  
pMarkerElement.Symbol = pVertexMarkerSymbol;  
var pEla = pMarkerElement as IElement;  
pEla.Geometry = ptSplit as IGeometry;  
pGraphicContainer.AddElement(pEla, 0);  
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
   
OnMouseUp事件打断线:  
IFeatureEdit featureEdit = ucDrawPanel.currentFeature as IFeatureEdit;  
ISet newFeaturesSet = featureEdit.Split(ptSplit);  
newFeaturesSet.Reset();  
IFeature feature = newFeaturesSet.Next() as IFeature;         

5、合并线

首先判断预合并的两条线拓扑关系,是否邻接关系;满足条件可以用关键字Merge实现,或者自定义方法,重新获取点的集合IPointCollection创建多线。
 
原文地址:https://www.cnblogs.com/arxive/p/6263130.html