地理点数据类型要求经度和纬度作为浮点数,但建议的数据类型为十进制。谁是对的?

时间:2012-03-15 14:25:19

标签: sql-server geospatial

如果您看到Point data type的Microsoft SQL Server 2008 R2文档,则它希望将纬度和经度作为浮点数给出。

然而,this post on SO suggests that the better data type for storing long and lat is decimal(9,6)

那么,为什么微软使用浮动?

更新 在下面的示例中,lat / long被非规范化以提高性能,我应该匹配点上的float数据类型,还是保持小数?

CREATE TABLE [dbo].[GeoTest](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [Lat] [decimal](9, 6) NOT NULL,
    [Long] [decimal](9, 6) NOT NULL,
    [GeoPoint] [GEOGRAPHY] NOT NULL,
 CONSTRAINT [PK_GeoTest] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

上面的架构允许我这样做:

SELECT Lat, Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20

而不是:

SELECT GeoPoint.Lat, GeoPoint.Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20

哪个更慢。令我感到奇怪的是,这两种数据类型不同。

1 个答案:

答案 0 :(得分:0)

在内部,SQL Server使用http://download.microsoft.com/download/7/9/3/79326E29-1E2E-45EE-AA73-74043587B17D/%5BMS-SSCLRT%5D.pdf

文档中描述的格式存储几何和地理数据

每个坐标值都被序列化为一个64位(8字节)长的双精度浮点值。因此,Point()方法的输入参数与此匹配是有意义的 - 即使用float数据类型。

正如@Pondlife指出的那样,你引用的另一篇文章与用于存储坐标值的通用数据类型有关,这是一个完全不同的问题。