具有不同精度的纬度和经度的浮点计算

时间:2009-08-24 01:25:59

标签: ruby floating-point geocoding geokit

后台:我收到一个long和lat作为Web服务的参数。它们通常最多6个小数位。当收到新请求时,我计算最后记录的loc与请求参数中的long / lat之间的距离。如果距离大于相隔英里的某个阈值,我会更新当前的loc。

问题:我使用geokit gem /插件来计算loc之间的距离。非常罕见,出现了一个错误(作者网站上提到的零距离错误 - 我使用1.4.1声称错误是固定的,但我仍然看到它发生耸肩)导致当计算两个相同点之间的距离时,距离计算返回一些非常不准确的东西(如果用户没有移动则会发生这种情况)。这导致更新用户当前不应发生的loc。你可能想知道 - 好吧,如果它只是更新loc是完全相同的坐标,谁在乎呢?好吧,答案是当更新loc使其成为一个实际问题时会发生一堆其他废话。

尝试解决方案:我尝试添加逻辑以手动检查两个位置是否相同,然后再计算距离,然后只是跳过计算而不更新(如果是这种情况)。传入参数为长/小时,小数点后6位;然而,在我的数据库中,我将值存储为浮点数,它似乎只存储4个小数位。这导致我的浮点数比较始终失败,并且继续发生不适当的loc更新。

先生,好吧,实际问题是:我应该如何进行这种比较?我是否应该从传入的纬度/长度中截取2个小数位,以某种方式向上舍入以使第四个数字正确然后进行比较?或者,我应该做一个“在一定范围内”的比较(例如,reported_loc.long> current_loc.long - .0001&& reported_loc.long< current_loc.long + .0001)?此外,对于现有的红宝石宝石/插件或内置功能的任何建议都会非常感激。

以下是日志的示例输出:

[update_loc] Last location history record at lat: 41.5024, long: -81.6816
[update_loc] Current loc at lat: 41.502467, long: -81.681623
[update_loc] Distance from current loc and last loc history: 5795.10615113555 miles
[update_loc] Locs not identical and distance greater than threshold, inserting new loc history
[update_loc] Location update complete

谢谢

汤姆

2 个答案:

答案 0 :(得分:3)

测试两个数字是否接近的常用方法是使用abs,即

 (reported_loc.long - current_loc.long).abs <= tol

其中tol是一些预先指定的容差,例如0.0001

答案 1 :(得分:2)

GPS接收器可以为您提供精确到多位小数的位置,但这并不意味着测量实际上是准确的。

通常,大约95%的测量值位于几米的圆周内,这与使用32位浮点数存储的精度大致相同。

但是,当您将gps日志绘制为地图上的浮点数时,您会清楚地注意到舍入错误。

无论如何,要进行此比较,我将使用范围而不是舍入传入值并将其与数据库值进行比较。您将无法再检测到最小的动作,但至少您不会再出现误报。

当你使用花车存放东西时,你显然不在乎毫米或厘米。