我现在第一次开始使用几何或地理数据类型,因为我们有一个2008R2的开发基线(!) 我正在努力找到如何存储圆形的表示。我们目前有圆的中心的纬度和长度以及半径,如: -
[Lat] [float] NOT NULL,
[Long] [float] NOT NULL,
[Radius] [decimal](9, 4) NOT NULL,
有没有人知道使用STGeomFromText方法存储它的等效方法,即使用哪个Well-Known Text(WKT)表示?我看过圆形字符串(LINESTRING)和曲线,但找不到任何例子......
感谢。
答案 0 :(得分:6)
如果使用SQL Server 2008,可以做的一件事是缓冲一个点并存储生成的Polygon(内部为众所周知的二进制文件)。例如,
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%)。
较少的分数会减少存储空间并使查询和STIntersection等查询更快,但显然会以准确性为代价。
编辑1:正如Jon Bellamy指出的那样,如果您选择使用Reduce函数,则参数需要与圆/缓冲半径成比例缩放,因为它是一个灵敏度因子根据{{3}}
删除积分 编辑2:还有一个函数Ramer-Douglas-Peucker algorithm,可用于近似带有多边形的圆。第二个参数,容差会影响此近似值的接近程度:值越低,点越多,逼近越好。第三个参数是一个位,表示公差相对于缓冲半径是相对的还是绝对的。可以使用此函数代替BufferWithTolerance
,STBuffer
组合来创建包含更多点的圆。
以下查询生成,
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之前没有Reduce
,这将允许您通过构建由两个半圆组成的CompoundCurve
来更紧凑和准确地存储圆圈,即,使用两个CircularStrings
。
答案 1 :(得分:1)
据我从文档中可以看出,CircularString仅在SQL Server 2012中添加。唯一的其他instantiable curve似乎是LineString,正如其名称所示,它编码一系列线段。因此,您最好的选择是将圆近似为具有足够数量角的(可能是常规的)多边形。如果这是不可接受的,您可能必须保留当前的数据结构,无论是空间数据类型还是空间数据类型,以验证匹配确实匹配圆圈。
这个答案完全是从文档中编写的,没有经验可以支持它。