首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GeoJson形状中打孔- clipperLib

在GeoJson形状中打孔- clipperLib
EN

Stack Overflow用户
提问于 2015-10-17 19:07:48
回答 1查看 519关注 0票数 1

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

示例图像:

我使用的是ClipperLib的C#版本:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-10-25 05:21:25

当你说你“想要在最大的形状上打洞”,我想你误解了Clipper库管理/定义多边形区域的方式。在Clipper中,多边形是由一系列闭合路径和指定的多边形填充定义的-最常见的是EvenOdd或NonZero filling rule。(在图形显示库中,多边形几乎总是以这种方式定义。)

因此,对于上面的数据,由于您使用的是NonZero填充,因此“孔”路径必须在方向上与容器外部路径的方向相反的方向上。如果内部路径与外部容器具有相同的方向,则使用NonZero填充执行“差异”裁剪操作将正确地忽略内部路径。

顺便说一下,当在一组多边形上执行裁剪操作时(例如,当没有裁剪路径时),执行“并集”操作更直观,因为在主题和裁剪区域之间的任何裁剪操作之前,主题路径是“并集”的(裁剪路径也是如此)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33185891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档