2016-11-28 2 views
0

私は例えば、SqlGeometryBuilderを使用してSqlGeometryを構成する方法を知っている:SqlGeometryが構築されるとSqlGeometryBuilderの反対を探す:SqlGeometryをどのように分解できますか?

// using Microsoft.SqlServer.Types; 
SqlGeometryBuilder geometryBuilder = new SqlGeometryBuilder(); 
geometryBuilder.SetSrid(…); 
geometryBuilder.BeginGeometry(OpenGisGeometryType.Polygon); 
geometryBuilder.BeginFigure(0, 0); 
geometryBuilder.AddLine(…); 
… 
geometryBuilder.EndFigure(); 
geometryBuilder.EndGeometry(); 

SqlGeometry geometry = geometryBuilder.ConstructedGeometry; 

、それはかなり不透明なオブジェクトだ、とその構成部品を検査する(その境界である例えば線分(STNumPointsSTPointNSTNumCurvesSTCurveNSTBoundary、など)を使用して、これらのラインのエンドポイントから構成されている)が少し煩わしいと感じます。

は、私はその構成部品に SqlGeometryを分解 に使用することができSqlGeometryBuilderの論理的に反対であるMicrosoft.SqlServer.Typesまたは.NET Frameworkクラスライブラリで何か、すなわち、何がありますか?私は、私が探しているものが訪問者のパターンを利用する可能性があると想像しています。

答えて

1

Microsoft.SqlServer.Types API the SqlGeometry.Populate(IGeometrySink110) methodの形で、SqlGeometryBuilder提供機能の逆を行います。

the IGeometrySink110 interfaceを実装するオブジェクトを受け入れます。その定義は、SqlGeometryBuilderと非常に似ています。このメソッドは、SqlGeometryを構築するためにSqlGeometryBuilderで使用されたメソッド呼び出しを「再生」します。

class ConsoleGeometrySink : IGeometrySink110 
{ 
    public void SetSrid(int srid) 
    { 
     Console.WriteLine($"SetSrid(srid: {srid})"); 
    } 
    public void BeginGeometry(OpenGisGeometryType type) 
    { 
     Console.WriteLine($"BeginGeometry(type: {type})"); 
    } 
    public void BeginFigure(double x, double y, double? z, double? m) 
    { 
     Console.WriteLine($"BeginFigure(x: {x}, y: {y}, z: {z}, m: {m})"); 
    } 
    public void AddCircularArc(double x1, double y1, double? z1, double? m1, 
           double x2, double y2, double? z2, double? m2) 
    { 
     Console.WriteLine($"AddCircularArc(x1: {x1}, y1: {y1}, z1: {z1}, m1: {m1}, " + 
             $"x2: {x2}, y2: {y2}, z2: {z2}, m2: {m2})"); 
    } 
    public void AddLine(double x, double y, double? z, double? m) 
    { 
     Console.WriteLine($"AddLine(x: {x}, y: {y}, z: {z}, m: {m})"); 
    } 
    public void EndFigure() 
    { 
     Console.WriteLine($"EndFigure()"); 
    } 
    public void EndGeometry() 
    { 
     WriteLine($"EndGeometry()"); 
    } 
} 

以下geometry.Populate(new ConsoleGeometrySink())希望出力呼び出す:

SetSrid(srid: …) 
BeginGeometry(type: Polygon) 
BeginFigure(x: 0, y: 0, z: , m:) 
AddLine(…) 
… 
EndFigure() 
EndGeometry() 

正確に反映上記の質問に示すように、次のIGeometrySink110実装と同様、SqlGeometry geometryを与え例えば

SqlGeometryを作成するために実行された元の手順。

関連する問題