Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 地理点数据类型要求将经度和纬度作为浮点,但建议的数据类型为十进制。谁说得对?_Sql Server_Geospatial - Fatal编程技术网

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

Sql server 地理点数据类型要求将经度和纬度作为浮点,但建议的数据类型为十进制。谁说得对?,sql-server,geospatial,Sql Server,Geospatial,如果您看到Microsoft SQL Server 2008 R2文档中的,它希望以浮点形式给出纬度和经度 然而 那么,为什么微软要使用浮动呢 更新: 在下面的示例中,lat/long被非规范化以提高性能,我应该匹配点上的浮点数据类型,还是保持十进制 CREATE TABLE [dbo].[GeoTest]( [Id] [INT] IDENTITY(1,1) NOT NULL, [Lat] [decimal](9, 6) NOT NULL, [Long] [decimal

如果您看到Microsoft SQL Server 2008 R2文档中的,它希望以浮点形式给出纬度和经度

然而

那么,为什么微软要使用浮动呢

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

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

这比较慢。这两种数据类型是不同的,这让我感到奇怪。

在内部,SQL Server使用

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


正如@Pondlife所指出的,您提到的另一篇文章涉及用于存储坐标值的通用数据类型,这是一个完全不同的问题。

在内部,SQL Server使用位于

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


正如@Pondlife所指出的,您提到的另一篇文章涉及存储坐标值的通用数据类型,这是一个完全不同的问题。

您真的能够准确地确定小数点后的位置吗,这样,任何一个都将是错误的决定?我认为您将点数据类型与以下问题混淆了:如果我不使用地理数据类型,我应该为lat/long使用哪种通用数据类型。这是两个完全不同的东西,所以比较它们没有意义。@Pondlife我想结合我的另一个问题,这更有意义:@Pondlife我正在考虑将lat/long作为非地理数据类型在同一个表中进行非规范化,作为性能优势点。看起来奇怪的是,非规范化数据类型与点输入参数不同。@Junto非规范化数据类型不必是小数9,6,它仍然可以是浮点。在另一个问题中使用十进制的建议是一个简单的陈述,没有任何解释。这并不意味着这是错误的,但您需要自己决定最佳选项是什么,同时考虑环境中的所有因素:性能、维护、编程的易用性、与应用程序和工具的兼容性等。作为一般性意见,从做最简单的事情开始,如果你真的需要,只担心性能优化。你真的能够准确地确定你的位置到小数点后的重要位置,这样任何一个都会是错误的决定吗?我认为你把点数据类型与问题混淆了,如果我不使用地理数据类型,我应该为lat/long使用什么通用数据类型。这是两个完全不同的东西,所以比较它们没有意义。@Pondlife我想结合我的另一个问题,这更有意义:@Pondlife我正在考虑将lat/long作为非地理数据类型在同一个表中进行非规范化,作为性能优势点。看起来奇怪的是,非规范化数据类型与点输入参数不同。@Junto非规范化数据类型不必是小数9,6,它仍然可以是浮点。在另一个问题中使用十进制的建议是一个简单的陈述,没有任何解释。这并不意味着这是错误的,但您需要自己决定最佳选项是什么,同时考虑环境中的所有因素:性能、维护、编程的易用性、与应用程序和工具的兼容性等。作为一般性意见,从做最简单的事情开始,如果确实需要,只需担心性能优化。