0

我正在查看 Sql Server 2008 中的几何数据类型,它看起来很有趣,但文档似乎并不那么好。我能否以 WKT 格式存储圆锥体、圆柱体和球体?这些特征传统上具有半径而不是数百个点。

4

3 回答 3

2

据我所知,您将不得不使用外部应用程序将您的形状呈现为大量点。有关渲染圆圈的技术,请参阅此博客

一种可以考虑的可能性是使用 CLR proc 来呈现您需要的形状和带有索引的视图。我不知道这会表现如何,但它可能会奏效。

于 2011-05-23T10:23:20.690 回答
2

这么晚才回复很抱歉。您始终可以编写自己的名为Circle的用户定义类型,具有两个属性,即CentroidRadius

在新形成的 UDT 中,创建一个采用属性 Centroid ( Point3D ) 和 Radius ( Double ) 的方法。在此之后,创建一个使用SqlGeometrySqlGeometryBuilder的方法来构建新形成的对象。

首先,创建Geometry的Point实例。从类对象继承 Centroid 值,然后创建另一个派生自Point对象的Geometry PolygonSTBuffer ( Radius )。

下面是我的例子:(写在 30 分钟内)

public SqlGeometry ToSQLGeometry()
    {
        int srid = this.SRID; // i.e. 4326

        SqlGeometry geom = new SqlGeometry();
        SqlGeometryBuilder gb = new SqlGeometryBuilder();
        OpenGisGeometryType pt = OpenGisGeometryType.Point;

        gb.SetSrid(srid);

        gb.BeginGeometry(pt);
        gb.BeginFigure(this.Centroid.X, this.Centroid.Y, this.Centroid.Z, this.Centroid.M);
        gb.EndFigure();
        gb.EndGeometry();

        geom = gb.ConstructedGeometry;
        geom = geom.MakeValid(); // Optional for Point data

        SqlGeometry geomCircle = new SqlGeometry();
        geomCircle = geom.STBuffer(this.Radius);

        return geomCircle;
    }

当您在 VS2010 中使用 CLR 项目类型完成此操作后,您可以将其部署到您的数据库中。

在 SQL 中,您可以这样调用对象:: Parse(XYZM,R)

declare @c Circle
set @c = Circle::Parse('5 6 7 8,2')
select 'Circle', @c.ToString(), @c.ToSQLGeometry()
于 2011-06-23T21:32:30.323 回答
1

快速浏览了一下,在Spatial Samples上找到了这个 MSDN 页面。它涵盖了在 WKT、WKB 和 XML(GML) 中输入数据的所有方法以及以人类可读形式查看数据的功能。它还涵盖 MakeValid、STIValid 和 STSrid。

看起来有一些您可能会觉得有用的 SQL 示例

于 2011-05-23T10:28:03.133 回答