我正在查看 Sql Server 2008 中的几何数据类型,它看起来很有趣,但文档似乎并不那么好。我能否以 WKT 格式存储圆锥体、圆柱体和球体?这些特征传统上具有半径而不是数百个点。
3 回答
据我所知,您将不得不使用外部应用程序将您的形状呈现为大量点。有关渲染圆圈的技术,请参阅此博客。
一种可以考虑的可能性是使用 CLR proc 来呈现您需要的形状和带有索引的视图。我不知道这会表现如何,但它可能会奏效。
这么晚才回复很抱歉。您始终可以编写自己的名为Circle的用户定义类型,具有两个属性,即Centroid和Radius。
在新形成的 UDT 中,创建一个采用属性 Centroid ( Point3D ) 和 Radius ( Double ) 的方法。在此之后,创建一个使用SqlGeometry和SqlGeometryBuilder的方法来构建新形成的对象。
首先,创建Geometry的Point实例。从类对象继承 Centroid 值,然后创建另一个派生自Point对象的Geometry Polygon和STBuffer ( 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()
快速浏览了一下,在Spatial Samples上找到了这个 MSDN 页面。它涵盖了在 WKT、WKB 和 XML(GML) 中输入数据的所有方法以及以人类可读形式查看数据的功能。它还涵盖 MakeValid、STIValid 和 STSrid。
看起来有一些您可能会觉得有用的 SQL 示例