围绕折线创建多边形,如缓冲区

我环顾四周寻找一个如何获取折线并在其周围创建缓冲区的示例,以便最终得到一个多边形。

到目前为止,我发现我需要Minkowskis Sums这样做,但我无法理解原始算法并将其转换为代码。

我更喜欢C#中的一个例子或算法的演练。

您可以在Clipper库中使用OffsetPolygons()函数,但首先需要将折线转换为多边形。 通过在折线附加折线的反向副本来执行此操作。 但由于不允许重复顶点,反向拷贝必须排除第一个和最后一个顶点:v1,v2,…,vn,v(n-1),…,v2。

在此处输入图像描述

以下是使用.NET Framework提供的2D对象(基于此链接)执行此类操作的示例方法

http://www.charlespetzold.com/blog/2008/04/Rounded-Graphics-in-WPF.html

// ... StreamGeometry geom = new StreamGeometry(); DrawLines(geom); Pen p = new Pen(Brushes.Black, 10); p.LineJoin = PenLineJoin.Round; p.EndLineCap = PenLineCap.Round; p.StartLineCap = PenLineCap.Round; PathGeometry pathGeomWide = geom.GetWidenedPathGeometry(p); PathGeometry pathGeom = pathGeomWide.GetOutlinedPathGeometry(); Path myPath = new Path(); myPath.Stroke = Brushes.Black; myPath.Data = pathGeom; myCanvas.Children.Add(myPath); // ... private static void DrawLines(StreamGeometry geom) { using (var context = geom.Open()) { context.BeginFigure(new Point(20, 20), false, true); context.LineTo(new Point(100, 20), true, true); context.LineTo(new Point(100, 100), true, true); context.LineTo(new Point(200, 100), true, true); } } 

在此处输入图像描述

您是否尝试过使用Codeplex的’Dot Spatial’库?

http://dotspatial.codeplex.com/

它在内部使用Geos和Proj4,它已经包含了您需要的所有function(世界上大多数GIS服务器和产品都是基于这两个代码库构建的!)

如果做不到这一点,你可以使用SQlite:

http://sqlite.phxsoftware.com/

和Spatialite:

http://www.gaia-gis.it/spatialite/

然后在C#中使用ADO.NET代码,您可以使用简单的GIS SQL查询来执行您的处理EG:

 SELECT AsText(ST_Buffer(polyline,0.25),4326) 

什么会返回一个字符串:

 MULTIPOLYGON((xy, xy, xy, x y......)) 

那你就可以解析了。

当您需要的一切都随时可用时,无需重新发明轮子。