ポリラインを取得してその周りにバッファーを作成する方法の例を見つけるために周りを見回したので、ポリゴンになってしまいました。
これまでのところ、そうするにはミンコフスキー和が必要であることがわかりましたが、生のアルゴリズムに頭を悩ませて、それをコードに変換することはできません。
C# の例またはアルゴリズムのウォークスルーを希望します。
Clipperライブラリの OffsetPolygons() 関数を使用できますが、最初にポリラインをポリゴンに変換する必要があります。これを行うには、ポリラインの反転コピーをポリラインに追加します。ただし、頂点の重複は許可されていないため、逆コピーでは最初と最後の頂点 v1、v2、...、vn、v(n-1)、...、v2 を除外する必要があります。
このリンクに基づいて、.NETFrameworkですでに利用可能な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 を内部的に使用しており、必要なすべての機能が既に含まれています (ほとんどの世界の GIS サーバーと製品は、これら 2 つのコードベースで構築されています!)
それができない場合は、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......))
その後、解析するだけです。
必要なものがすべて揃っているので、一からやり直す必要はありません。