/// <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); }
/// <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; } } }