我有几个重叠的形状。我希望能够在包含所有较小形状的最大形状上打洞。这些孔将代表较大形状中的较小形状。
示例图像:

我使用的是ClipperLib的C#版本:
const double precisionFactor = 1000000000000000.0;
//precondition: all your polygons have the same orientation
//(ie either clockwise or counter clockwise)
Polygons polys = new Polygons();
multiPolygon.ForEach(x =>
{
Polygon polygon = x.First().Select( y => new IntPoint()
{
X = (long)(y[0] * precisionFactor),
Y = (long)(y[1] * precisionFactor)
}).ToList();
polys.Add(polygon);
});
Polygons solution = new Polygons();
Clipper c = new Clipper();
c.AddPaths(polys, PolyType.ptSubject,true);
c.Execute(ClipType.ctDifference, solution,
PolyFillType.pftNonZero, PolyFillType.pftNonZero);
var coordinates = solution.SelectMany(x => x.Select(y=> (IList<double>)new List<double>()
{
y.X / precisionFactor,
y.Y / precisionFactor
}).ToList()) .ToList();
return coordinates;但返回的形状是上图中最大的形状。
GeoJson文件:http://s000.tinyupload.com/download.php?file_id=62259172894067221043&t=6225917289406722104327028
发布于 2015-10-25 05:21:25
当你说你“想要在最大的形状上打洞”,我想你误解了Clipper库管理/定义多边形区域的方式。在Clipper中,多边形是由一系列闭合路径和指定的多边形填充定义的-最常见的是EvenOdd或NonZero filling rule。(在图形显示库中,多边形几乎总是以这种方式定义。)
因此,对于上面的数据,由于您使用的是NonZero填充,因此“孔”路径必须在方向上与容器外部路径的方向相反的方向上。如果内部路径与外部容器具有相同的方向,则使用NonZero填充执行“差异”裁剪操作将正确地忽略内部路径。
顺便说一下,当在一组多边形上执行裁剪操作时(例如,当没有裁剪路径时),执行“并集”操作更直观,因为在主题和裁剪区域之间的任何裁剪操作之前,主题路径是“并集”的(裁剪路径也是如此)。
https://stackoverflow.com/questions/33185891
复制相似问题