围绕折线创建多边形,如缓冲区
我环顾四周寻找一个如何获取折线并在其周围创建缓冲区的示例,以便最终得到一个多边形。
到目前为止,我发现我需要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......))
那你就可以解析了。
当您需要的一切都随时可用时,无需重新发明轮子。