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

时间:2011-11-22 11:52:53

标签: c# geometry polygon polyline

我已经四处寻找一个如何获取折线并在其周围创建缓冲区的示例,因此我最终得到了一个多边形。

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

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

3 个答案:

答案 0 :(得分:4)

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

enter image description here

答案 1 :(得分:3)

以下是基于此链接使用.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);
  }
}

enter image description here

答案 2 :(得分:1)

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

http://dotspatial.codeplex.com/

使用Geos&内部的Proj4,已经包含了您需要的所有功能(世界上大多数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((x y, x y, x y, x y......))

然后你可以解析。

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