首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找与SqlGeometryBuilder相反的东西:如何分解SqlGeometry?

寻找与SqlGeometryBuilder相反的东西:如何分解SqlGeometry?
EN

Stack Overflow用户
提问于 2016-11-28 21:56:02
回答 1查看 421关注 0票数 0

我知道如何使用SqlGeometry 编写 SqlGeometryBuilder,例如:

代码语言:javascript
复制
// 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;

一旦构建了一个SqlGeometry,它基本上就是一个不透明的对象,并使用ST…方法(STNumPointsSTPointNSTNumCurvesSTCurveNSTBoundary等)检查它的组成部分(例如,它的边界由线段组成,以及这些线的端点)。我觉得有点麻烦。

Microsoft.SqlServer.Types或.NET框架类库中是否存在与SqlGeometryBuilder逻辑相反的东西,即我可以用来将分解成其组成部分的东西?我想我正在寻找的东西可能会利用访问者的模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-28 21:56:02

Microsoft.SqlServer.Types API提供了与SqlGeometryBuilder相反的功能,形式为method

该方法接受一个实现 interface的对象,其定义非常接近于SqlGeometryBuilder的定义。该方法将“重播”用于构造SqlGeometryBuilder的方法调用,以构造SqlGeometry

例如,给定上面问题中所示的SqlGeometry geometry,以及下面的IGeometrySink110实现:

代码语言:javascript
复制
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())将输出以下内容:

代码语言:javascript
复制
SetSrid(srid: …)
BeginGeometry(type: Polygon)
BeginFigure(x: 0, y: 0, z: , m: )
AddLine(…)
…
EndFigure()
EndGeometry()

它准确地反映了构建SqlGeometry所执行的原始步骤。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40854218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档