DotSpatial 要素删除节点


/// <summary>
/// 要素删除节点
/// </summary>
/// <param name="selectedFeature">被选中的要素</param>
/// <param name="deleteCoord">节点坐标</param>

1  private void DeleteVertex(IFeature selectedFeature, Coordinate deleteCoord)
  2         {
  3             if (selectedFeature == null)
  4             {
  5                 return;
  6             }
  7 
  8             if (_layer.DataSet.FeatureType == FeatureType.Polygon)
  9             {
 10                 _layer.EditMode = true;
 11 
 12                 for (int prt = 0; prt < selectedFeature.Geometry.NumGeometries; prt++)
 13                 {
 14                     IGeometry g = _selectedFeature.Geometry.GetGeometryN(prt);
 15                     Polygon poly = (Polygon)g;
 16 
 17                     #region 外环中查找
 18 
 19                     List<Coordinate> listCoorExtRing =poly.ExteriorRing.Coordinates.ToList<Coordinate>();
 20 
 21                     for (int ic = 0; ic < listCoorExtRing.Count; ic++)
 22                     {
 23                         if (listCoorExtRing[ic] == deleteCoord)
 24                         {
 25                             if (ic == 0 || ic == listCoorExtRing.Count - 1)//首节点被选中时,首末节点均删除
 26                             {
 27                                 listCoorExtRing.RemoveAt(listCoorExtRing.Count - 1);
 28                                 listCoorExtRing.RemoveAt(ic);
 29 
 30                                 listCoorExtRing.Add(listCoorExtRing[0]);
 31                                 break;
 32                             }
 33                             else
 34                             {
 35                                 listCoorExtRing.RemoveAt(ic);
 36 
 37                                 break;
 38                             }
 39                         }
 40                     }
 41                     //创建外环
 42                     LinearRing ringExterior = new LinearRing(listCoorExtRing.ToArray());
 43 
 44                     #endregion
 45 
 46                     #region 内环中查找
 47 
 48                     LinearRing[] ringInterior = null;
 49                     if (poly.NumInteriorRings > 0)
 50                     {
 51                         ringInterior = new LinearRing[poly.NumInteriorRings];
 52 
 53                         //遍历内环
 54                         for (int i = 0; i < poly.NumInteriorRings; i++)
 55                         {
 56                             List<Coordinate> listCoorIntRing =poly.GetInteriorRingN(i).Coordinates.ToList<Coordinate>();
 57                             //判断
 58                             for (int ic = 0; ic < listCoorIntRing.Count; ic++)
 59                             {
 60                                 if (listCoorIntRing[ic] == deleteCoord)
 61                                 {
 62                                     if (ic == 0 || ic == listCoorIntRing.Count - 1)//首节点被选中时,首末节点均删除
 63                                     {
 64                                         listCoorIntRing.RemoveAt(listCoorIntRing.Count - 1);
 65                                         listCoorIntRing.RemoveAt(ic);
 66 
 67                                         listCoorIntRing.Add(listCoorIntRing[0]);
 68                                         break;
 69                                     }
 70                                     else
 71                                     {
 72                                         listCoorIntRing.RemoveAt(ic);
 73                                         break;
 74                                     }
 75                                 }
 76                             }
 77 
 78                             ringInterior[i] = new LinearRing(listCoorIntRing.ToArray());
 79                             listCoorIntRing = null;
 80                         }
 81                     }
 82 
 83                     #endregion
 84 
 85                     #region 要素Geometry更新
 86                                       
 87                     Polygon polyNew = null;
 88                     if (poly.NumInteriorRings > 0)//存在内环
 89                     {
 90                         polyNew = new Polygon(ringExterior, ringInterior);
 91                     }
 92                     else //仅存在外环
 93                     {
 94                         polyNew = new Polygon(ringExterior);
 95                     }
 96 
 97                     selectedFeature.Geometry = polyNew;
 98 
 99                     #endregion
100 
101                 }
102                 _layer.DataSet.InvalidateVertices();
103                 _layer.DataSet.UpdateExtent();
104                 _layer.DataSet.Save();
105 
106                 _layer.EditMode = false;
107 
108                 Map.Invalidate();
109             }
110         }
原文地址:https://www.cnblogs.com/kogame/p/15647063.html