检查经度和纬度时发生无效的浮点运算

时间:2014-06-18 13:29:48

标签: sql sql-server math latitude-longitude

我知道有很多像我一样的问题。我看着他们,但我似乎无法解决问题。我的数学很糟糕:s。

在c#中我使用SqlQuery来获取范围内的城市。除了一些城市外,大部分时间都可以使用。

例如,如果我向附近城市询问邮政编码为2060.我收到此错误。当我要求代码为2000的城市时,它返回2000和2060。

  • 2060: Lat = 51.2293515000 = 4.4279883000
  • 2000: Lat = 51.2198771000 = 4.4011356000

这是查询:

return base.Database.Database.SqlQuery<City>(
"SELECT * FROM [dbo].[City] WHERE @p0 >= (((acos(sin((@p1*pi()/180)) *
sin(([Latitude]*pi()/180))+cos((@p1*pi()/180)) * cos(([Latitude]*pi()/180)) *
cos(((@p2- [Longitude])*pi()/180))))*180/pi())*60*1.1515*1.609344)"
, radius, latitude, longitude);

有人可以解释一下这是如何改变的,这样它适用于所有“城市”以及数学中菜鸟的这个错误的原因吗?

谢谢

1 个答案:

答案 0 :(得分:0)

问题是,当你将城市与自己进行比较时,acos()内的语句会出现舍入错误,并且语句会略微超过1,这会导致错误。

您需要以某种方式将值限制为最大值1。这是一个相当丑陋的解决方案:

return base.Database.Database.SqlQuery<City>(
"SELECT * FROM [dbo].[City] WHERE @p0 >= (((acos((select min(v) from (values  (1), (sin((@p1*pi()/180)) *
sin(([Latitude]*pi()/180))+cos((@p1*pi()/180)) * cos(([Latitude]*pi()/180)) *
cos(((@p2- [Longitude])*pi()/180)))) as x(v))))*180/pi())*60*1.1515*1.609344)"
, radius, latitude, longitude);

我不确定,但它有时可能会略微小于-1,这也会出现同样的错误。然后,您必须将值限制在-1和1之间。