【问题标题】:Bug in SQL Server geography?SQL Server 地理中的错误?
【发布时间】:2012-11-20 12:51:01
【问题描述】:

有人可以确认这是一个错误还是我做错了什么?

我有这个存储过程 (SQL Server 2008)

ALTER PROCEDURE [dbo].[Distance]
@origin varchar(50),@destination varchar(50),@unit varchar(5)
as
   declare @or geography, @dest  geography
   SET @or = (select Location from [dbo].Promotion where Name=@origin )
   SET @dest = (select Location from [dbo].Promotion where Name=@destination )
IF @unit='miles'
 SELECT @or.STDistance(@dest)/1609.344
ELSE
 --Else show the distance in km
 SELECT @or.STDistance(@dest)/1000

位置是数据库中的地理数据类型

我在数据库中有这个地址

     Latitude     Longitude
1   -34.612654   -58.463586 
2   -34.592802   -58.454317 
3   -34.597889   -58.617949

然后运行这个:

execute dbo.Distance 'Number 1','Number 2','km'
returns 2653.49845233371 kms

execute dbo.Distance 'Number 1','Number 3','km'
returns 17.2155414117145 kms

如果您在第一种情况下使用 Google 地图,这些坐标之间的距离约为 4 公里,而第二次比较似乎还可以。

为什么第一个错了?它是 SQL Server 中的错误吗?

提前致谢。吉列尔莫。

【问题讨论】:

  • 使用大型应用程序的第一条规则是被数百万人使用 - 错误在您的代码中。第二条规则 - 错误在您的代码中。第三条规则......你明白了;)
  • 我假设 Location 是一个计算列,基于纬度和经度列?如果是这样,你能给出它的定义吗? (如果您可以创建一个简单的表、一个INSERT 用您的示例数据填充它,以及一个简单的查询来产生结果,这样其他人就可以重现这个,那就容易多了)

标签: sql-server sql-server-2008 sqlgeography geographic-distance


【解决方案1】:

好的,我找到了问题所在,是的,当然是我的错 :)

我已经像这样在表中插入记录

INSERT INTO [dbo].[TestLocation]([Name],[Location],[Latitude],[Longitude]) VALUES('Location1', geography::STGeomFromText('POINT(-34.612654 -58.463586)', 4326),-34.612654,-58.463586);

然后我意识到,起初,纬度和经度是颠倒的,所以我改变了顺序,但只是为了最后两个字段而忘记改变“geography::STGeomFromText”中的顺序。运行后

SELECT
  Ubicacion.Lat,
  Ubicacion.Long
FROM
  Promotion

我意识到错误是什么。呵呵!

注意这一点

SELECT
  Ubicacion.Lat,
  Ubicacion.Long
FROM
  Promotion

请注意这一点,因为 geography 数据类型保存为二进制,因此人类不可读,因此,除非您运行上述查询,否则您不会意识到问题的根源。

谢谢!吉列尔莫。

【讨论】:

  • 这是将Location 的定义从Location geography not null 更改为Location AS geography::Point(Latitude,Longitude,4326) 的一个很好的理由。或者换一种说法,不要存储计算值。 (可选地,添加persisted not null,它甚至应该允许它被索引)
猜你喜欢
  • 2016-03-27
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多