如果您使用的是 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%)。
更少的点将减少存储空间,并使 STIntersects 和 STIntersection 等查询更快,但显然是以准确性为代价的。
编辑 1: 正如 Jon Bellamy 指出的那样,如果您选择使用 Reduce 函数,则该参数需要与圆/缓冲区半径成比例缩放,因为它是删除点,基于Ramer-Douglas-Peucker algorithm
编辑 2: 还有一个函数,BufferWithTolerance,可用于用多边形近似圆。第二个参数,公差影响这个近似值的接近程度:值越低,点越多,近似值越好。第三个参数是位,表示公差相对于缓冲区半径是相对的还是绝对的。这个函数可以用来代替STBuffer、Reduce的组合来创建一个有更多点的圆。
以下查询产生,
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,即使用两个@ 987654339@.