「NTS」は、「JTS」の.NET版のオープンソースライブラリで、C#で、図形演算が可能になります。
今回は、この「NTS」を利用して、ポリゴンの結合を行います。
1.NTSを使ったポリゴン結合例
NTSでは、Geometoryクラスの、Unionメソッドを利用します。使う側は、非常に簡単です。自分では到底作れません。
以下、ソースの記述例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var reader = new WKTReader(); // 結合するポリゴン一覧 var rlist = new List() { reader.Read("POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100))"), reader.Read("POLYGON ((150 150, 150 250, 250 250, 250 150, 150 150))") }; // 結合したポリゴン IGeometry unionPoly = null; foreach (var rPoly in rlist) { if (unionPoly == null) { unionPoly = rPoly.Geometry; } else { // ポリゴンを結合 unionPoly = unionPoly.Union(rPoly); } } // 結合したポリゴンの結果を出力 logger.DebugFormat("wkt={0}", unionPoly.Geometry.AsText()); |
2.様々なパターンのポリゴンを結合
上記の例を含め様々なパターンのポリゴンを結合していました。結果は以下の通り
No | 図形の条件 | 結合前の図形 | 結合後の図形 |
1 | 2つの図形が同じ | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) |
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) | ||
2 | 2つの図形が点で接している | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((200 200, 200 300, 300 300, 300 200, 200 200)) |
MULTIPOLYGON (((100 100, 100 200, 200 200, 200 100, 100 100)), ((200 200, 200 300, 300 300, 300 200, 200 200))) |
||
3 | 2つの図形が面で接している | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((100 200, 100 300, 200 300, 200 200, 100 200)) |
POLYGON ((100 100, 100 200, 100 300, 200 300, 200 200, 200 100, 100 100)) | ||
4 | 2つの図形が一部重なっている | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((150 150, 150 250, 250 250, 250 150, 150 150)) |
POLYGON ((100 100, 100 200, 150 200, 150 250, 250 250, 250 150, 200 150, 200 100, 100 100)) | ||
5 | 一方の図形に含まれている | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((125 125, 125 175, 175 175, 175 125, 125 125)) |
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) | ||
6 | 2つの図形が離れている | ||
POLYGON ((100 100, 100 200, 200 200, 200 100, 100 100)) POLYGON ((250 100, 250 200, 350 200, 350 100, 250 100)) |
MULTIPOLYGON (((100 100, 100 200, 200 200, 200 100, 100 100)), ((250 100, 250 200, 350 200, 350 100, 250 100))) |