Tsql 在几何图形数据类型中插入圆

Tsql 在几何图形数据类型中插入圆,tsql,sql-server-2008-r2,geometry,geospatial,computational-geometry,Tsql,Sql Server 2008 R2,Geometry,Geospatial,Computational Geometry,现在我们有了2008R2(!)的开发基线,我将第一次开始使用几何或地理数据类型 我正在努力寻找如何存储圆的表示。我们现在有圆心的纬度和长度以及半径,类似于:- [Lat] [float] NOT NULL, [Long] [float] NOT NULL, [Radius] [decimal](9, 4) NOT NULL, 是否有人知道使用STGeomFromText方法存储此数据的等效方法,即使用哪种著名文本(WKT)表示?我已经看过圆字符串(LINESTRING)和曲线,但找不到任何示例

现在我们有了2008R2(!)的开发基线,我将第一次开始使用几何或地理数据类型 我正在努力寻找如何存储圆的表示。我们现在有圆心的纬度和长度以及半径,类似于:-

[Lat] [float] NOT NULL,
[Long] [float] NOT NULL,
[Radius] [decimal](9, 4) NOT NULL,
是否有人知道使用STGeomFromText方法存储此数据的等效方法,即使用哪种著名文本(WKT)表示?我已经看过圆字符串(LINESTRING)和曲线,但找不到任何示例


谢谢。

从文档中我可以看出,它只是为SQL Server 2012添加的。另一种似乎是,顾名思义,编码一系列线段。因此,最好将圆近似为(可能是正的)多边形,并具有足够多的角。如果这是不可接受的,那么您可能必须保留当前的数据结构,可以是独占的,也可以是空间数据类型之外的,以验证其中的匹配是否确实与圆匹配


这个答案纯粹是从文档中编写的,没有任何经验支持。

如果使用SQL Server 2008,可以做的一件事是缓冲一个点并存储生成的多边形(内部为众所周知的二进制)。比如说,

declare @g geometry
set @g=geometry::STGeomFromText('POINT(0 0)', 4326).STBuffer(1)
select @g.ToString()
select @g.STNumPoints()
select @g.STArea()
这个输出,WKT

多边形((0-1,0.051459848880767822-0.99869883060455322,0.10224419832229614-0.99483710527420044,0.15229016542434692-0.98847776651382446,0.20153486728668213-0.979683578014378,0.24991559982299805-0.968517363071445,…,0-1))

点的数量129,从中可以看出,缓冲一个圆使用128个点加上一个重复的起点和区域3.1412,精确到小数点后3位,与实际值相差0.01%,这在许多用例中是可以接受的

如果您想要更低的精度(即更少的点数),可以使用
Reduce
功能减少点数,例如

declare @g geometry
set @g=geometry::STGeomFromText('POINT(0 0)', 4326).STBuffer(1).Reduce(0.01) 
它现在生成一个具有33个点和3.122面积的圆近似值(现在比PI的实际值小0.6%)

更少的点数将减少存储空间,并使诸如STIntersects和STIntersection之类的查询更快,但显然以牺牲准确性为代价

编辑1:正如Jon Bellamy所指出的,如果选择使用Reduce函数,则需要根据圆/缓冲区半径按比例缩放参数,因为它是基于

编辑2:还有一个函数,可用于用多边形近似圆。第二个参数,公差影响此近似值的接近程度:值越低,点越多,近似值越好。第三个参数是一个位,指示公差相对于缓冲区半径是相对的还是绝对的。可以使用此函数而不是组合来创建具有更多点的圆

下面的查询生成

declare @g geometry
set @g=geometry::STGeomFromText('POINT(0 0)', 4326).BufferWithTolerance(1,0.0001,1)
select @g.STNumPoints()
select @g.STArea()
一个由321个点组成的“圆”,面积为3.1424,即在PI真实值的0.02%范围内(但现在更大),实际精度低于上述简单缓冲区。进一步增加公差不会导致精度的任何显著提高,这表明该方法存在上限


正如MvG所说,在SQL Server 2012之前没有任何限制,这将允许您通过构建由两个半圆组成的
CompoundCurve
,即使用两个
circularstring

来更紧凑、更准确地存储圆。John,我要添加的唯一一件事是将值传递到“Reduce()”(如果使用的话)将需要与半径成比例地增加,以尝试保持结果相同。例如,您的Reduce示例将STBuffer值为1时的点数从129减少到33,但STBuffer值为100时则没有区别。基本上,请记住按STBuffer的比例增加Reduce的值。1缓冲区到0.01减少,100缓冲区到1减少,502到5.02等等。谢谢Jon,我忘了把它放进去。将编辑我的答案非常感谢伙计们,谁会想到一个叫做“STBuffer”的东西将用于椭球体?看起来我还可以使用“.BufferWithTolerance”来更改精度。再次感谢您对我的第一个StackOverflow问题的及时回复:)Dawn,BufferWithTolerance看起来比Buffer plus Reduce更好。我会更新答案,一旦我有机会有一个适当的看它。干杯。您可能希望包含和的链接。