天天看点

AE 线编辑1、高亮显示节点2、添加节点3、删除节点4、打断线5、合并线

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创建多线。

下一篇: poj 1162 java