Exemple #1
0
 /// <summary>
 /// 兩塊地籍合併
 /// </summary>
 /// <param name="polyLand1">第一塊地籍</param>
 /// <param name="polyLand2">第二塊地籍</param>
 /// <returns>合併後的多邊形</returns>
 public Polygon TwoPieces(PolyLand polyLand1, PolyLand polyLand2)
 {
     var polygon1 = new Polygon(polyLand1.Points);
     var polygon2 = new Polygon(polyLand2.Points);
     //if (polygon1.Intersects(polygon2) || polygon1.Touches(polygon2))
     //{
     //    return polygon1.Union(polygon2) as Polygon;
     //}
     //else
     //{
         SetupBorders(polyLand1);
         SetupBorders(polyLand2);
         var list = new List<Polygon>();
         foreach (var border1 in polyLand1.Borders)
         {
             foreach (var border2 in polyLand2.Borders)
             {
                 var pg = GetConvexHull(border1, border2);
                 if (pg.Centroid.Distance(border1) <= _tolerance
                     && pg.Centroid.Distance(border2) <= _tolerance
                     )
                 {
                     pg = pg.Union(polygon1).Union(polygon2) as Polygon;
                     list.Add(pg);
                 }
             }
         }
         switch (list.Count)
         {
             case 0:
                 return null;
             case 1:
                 return list.First();
             default:
                 var result = list.First();
                 list.Remove(result);
                 foreach (var item in list)
                 {
                     result = result.Union(item) as Polygon;
                 }
                 return result;
         }
     //}
 }
 public void SetupBorders_當邊界線位於四個角落_應該切為兩段()
 {
     var polyland = new PolyLand()
     {
         Code = "03020015",
         Points = new List<Coordinate>()
         {
             new Coordinate(275503.47799410898,2757594.7833203459),
             new Coordinate(275466.72964286612,2757591.8214018894),
             new Coordinate(275429.94121402991,2757588.9532408221),
             new Coordinate(275429.93469449208,2757545.8932697494),
             new Coordinate(275500.75199733494,2757545.8642775714),
             new Coordinate(275503.22490233264,2757555.2275553606),
             new Coordinate(275508.72536459984,2757576.5936708814),
             new Coordinate(275508.03962494305,2757584.0420535933),
             new Coordinate(275507.41859157098,2757591.4964217525),
             new Coordinate(275503.47799410898,2757594.7833203459)
         }
     };
     
     var merger = new Merger(_boundaries);
     merger.SetupBorders(polyland);
     Assert.AreEqual(2, polyland.Borders.Count);
 }
Exemple #3
0
        /// <summary>
        /// 取得多邊形所有的圖幅框邊界線
        /// </summary>
        /// <param name="polyLand">要判斷的多邊形</param>
        public void SetupBorders(PolyLand polyLand)
        {
            polyLand.Borders = new List<LineString>();
            var boundary = _mapBoxs.First(x => x.Code == polyLand.Code);
            LineString prev = null;
            for (var i = 1; i < polyLand.Points.Count; i++)
            {
                var ls = GetLineString(polyLand.Points[i - 1], polyLand.Points[i]);
                if (IsLineTouchesBoundary(ls, boundary.Extents))
                {
                    if (prev != null)
                    {
                        //prev = prev.Union(ls) as LineString;
                        var prevAngle = Convert.ToInt32(prev.Angle);
                        var lsAngle = Convert.ToInt32(ls.Angle);
                        var angle = Math.Abs(prevAngle - lsAngle);

                        if ((angle >= 89 && angle <= 91) || angle >= 269 && angle <= 271)
                        {
                            //如果為垂直相交則必須分成兩段
                            polyLand.Borders.Add(ls);
                            prev = ls;
                        }
                        else
                        {
                            prev.Coordinates.Add(polyLand.Points[i]);   
                        }
                    }
                    else
                    {
                        polyLand.Borders.Add(ls);
                        prev = ls;
                    }
                }
                else
                {
                    prev = null;
                }
            }
        }