效果图
进行线构面:
- 构成了两个多边形ABCD、EFGH
- DI、IE是割边(CutEdge)
- 有三条悬挂边:CK、FJ、OP
- 有自相交的无效环:ALMN
示例代码
var r = new WKTReader();
var wkts = new string[]
{
"linestring(0 0,3 0)",
"linestring(3 3,3 0)",
"linestring(3 3,0 3)",
"linestring(0 0,0 3)",
"linestring(4 2,0 3)",
"linestring(0 3,-1 4)",
"linestring(0 5,-1 4)",
"linestring(0 5,2 5)",
"linestring(2 7,2 5)",
"linestring(2 7,0 7)",
"linestring(0 5,0 7)",
"linestring(2 5,4 6)",
"linestring(-3 3,-3 5)",
"linestring(0 0,-3 2)",
"linestring(-1 2,-3 2)",
"linestring(-1 2,-3 0)",
"linestring(0 0,-3 0)",
};
var lines = wkts.Select(x => r.Read(x)).ToList();
var pz = new Polygonizer();
foreach (var line in lines)
{
pz.Add(line);
}
var dangles = pz.GetDangles();
var cutEdges = pz.GetCutEdges();
var invalidRings = pz.GetInvalidRingLines();
var polygons = pz.GetPolygons();
Console.WriteLine("多边形:");
foreach (var polygon in polygons)
{
Console.WriteLine(polygon.AsText());
}
Console.WriteLine("\n悬挂边:");
foreach (var item in dangles)
{
Console.WriteLine(item.AsText());
}
Console.WriteLine("\n割边:");
foreach (var item in cutEdges)
{
Console.WriteLine(item.AsText());
}
Console.WriteLine("\n无效环:");
foreach (var item in invalidRings)
{
Console.WriteLine(item.AsText());
}
打印结果:
多边形:
POLYGON ((3 0, 0 0, 0 3, 3 3, 3 0))
POLYGON ((2 5, 0 5, 0 7, 2 7, 2 5))
悬挂边:
LINESTRING (2 5, 4 6)
LINESTRING (4 2, 0 3)
LINESTRING (-3 3, -3 5)
割边:
LINESTRING (0 3, -1 4)
LINESTRING (0 5, -1 4)
无效环:
LINESTRING (0 0, -3 2, -1 2, -3 0, 0 0)
LINESTRING (-3 2, 0 0, -3 0, -1 2, -3 2)