生活随笔
收集整理的這篇文章主要介紹了
多个图元合并其中相邻的图元
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
沒有刪除原來的圖形。
誤區
雙重foreach
對原始數據foreach后又對最終數據進行foreach,這樣會多出許多的多段線
Key:從列表中找到與新加入的圖形相鄰的圖形。列表中的圖形都是不需要合并的,因為在之前已經驗證了他們之間的關系,只需要對新加入的圖形進行判斷即可。之前的方法是每次都對列表中圖元之間的關系進行判斷,需要考慮的因素太多,而且沒有找到正確的解決方案。
合并:
list1,原始數據
list2,最終數據
循環list1
向list2中添加成員
判斷list2的個數是否大于1
小于1,繼續循環
大于1,調用方法,在list2中找到新加入的成員相鄰的圖元
若不為空,則將新加入的成員和與新加入的成員相鄰的圖元傳入合并圖元的方法
向list2中加入合并完成后的豫園
在list2中去除合并的兩個圖元
完成
/// <summary>/// 得到合并相鄰的圖形后的圖形列表/// </summary>/// <param name="hPlyList"></param>/// <returns></returns>private List<Polyline> GetMergePolylineList(List<Polyline> hPlyList){List<Polyline> plys = new List<Polyline>();PolylineEditService service = new PolylineEditService();//循環所有多段線foreach (Polyline ply in hPlyList){plys.Add(ply);if (plys.Count < 2){continue;}Polyline plyIntersect = this.GetIntersectPly(ply, plys);//判斷多段線是否相鄰if (plyIntersect != null){List<Polyline> list = new List<Polyline>();list.Add(ply);list.Add(plyIntersect);//合并多段線Polyline plyUnion = service.GetUnionPolylines(list);plys.Add(plyUnion);plys.Remove(ply);plys.Remove(plyIntersect);}}return plys;}/// <summary>/// 從列表中找到相鄰的圖形/// </summary>/// <param name="ply"></param>/// <param name="plys"></param>/// <returns></returns>private Polyline GetIntersectPly(Polyline ply, List<Polyline> plys){foreach (var item in plys){if (item.Handle.Value.ToString().Equals(ply.Handle.Value.ToString())){continue;}//判斷多段線是否相鄰if (item.IsIntersectPolyline(ply)){return item;}}return null;}/// <summary>/// 得到合并之后的多段線/// </summary>/// <param name="plyList"></param>/// <returns></returns>public Polyline GetUnionPolylines(List<Polyline> plyList){List<GeoAPI.Geometries.IGeometry> polygons = new List<GeoAPI.Geometries.IGeometry>();foreach (var ply in plyList){PolylineObject plyObj = new PolylineObject(ply);List<PointModel> points = plyObj.GetPointModelList();if (points.Count > 0){GeoAPI.Geometries.IPolygon polygon = PolygonUtil.GetPolygon(points);polygons.Add(polygon);}}List<PointModel> pts = PolygonUtil.GetUninonPolygon(polygons);if (pts == null || pts.Count == 0){return null;}Polyline plyUnion = new Polyline(pts.Count);for (int i = 0; i < pts.Count; i++){PointModel ptModel = pts[i];Point2d pt = new Point2d(ptModel.X, ptModel.Y);plyUnion.AddVertexAt(i, pt, 0, 0, 0);}return plyUnion;}
總結
以上是生活随笔為你收集整理的多个图元合并其中相邻的图元的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。