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



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

[Lat] [float] NOT NULL,
[Long] [float] NOT NULL,
[Radius] [decimal](9, 4) NOT NULL,

有人知道使用STGeomFromText方法存储它的等效方法吗,即使用哪种已知文本(WKT)表示?我看过圆形字符串(LINESTRING)和曲线,但找不到任何例子。。。。

谢谢。

如果使用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,

POLYGON ((0 -1, 0.051459848880767822 -0.99869883060455322, 0.10224419832229614 -0.99483710527420044, 0.15229016542434692 -0.98847776651382446, 0.20153486728668213 -0.97968357801437378, 0.24991559982299805 -0.96851736307144165,... , 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%)。

更少的点将减少存储,并使STIntersections和STIntersection等查询更快,但显然,这是以准确性为代价的。

第1版:正如Jon Bellamy所指出的,如果您选择使用Reduce函数,则需要根据圆/缓冲区半径按比例缩放参数,因为这是一个基于Ramer Douglas Peucker算法的去除点的敏感系数

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

以下查询产生

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之前没有CircularString or CompoundCurve,这将允许您通过构建由两个半圆组成的CompoundCurve(即使用两个CircularStrings)来更紧凑、更准确地存储圆。

据我从文档中所知,CircularString只是为SQL Server 2012添加的。唯一的另一条可实例化曲线似乎是LineString,顾名思义,它编码一系列线段。因此,你最好的选择是将圆近似为一个(可能是正的)多边形,其中有足够数量的角。如果这是不可接受的,您可能必须保留当前的数据结构,无论是专门的还是除了空间数据类型之外,以验证那里的匹配确实与圆匹配。

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

最新更新