2

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

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

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

唷,好的,所以实际的问题是:我应该如何进行这种比较?我是否应该从传入的纬度/经度中截断小数点后 2 位,以某种方式四舍五入,以便第四位正确,然后进行比较?或者,我应该进行“在一定范围内”的比较(例如,reported_loc.long > current_loc.long - .0001 && reported_loc.long < current_loc.long + .0001)?此外,任何对现有 ruby​​ gem/plugins 或内置函数的建议都将不胜感激。

以下是日志的示例输出:

[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

谢谢

汤姆

4

2 回答 2

3

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

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

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

于 2009-08-24T02:14:17.357 回答
2

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

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

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

无论如何,为了进行这种比较,我会使用一个范围,而不是对传入的值进行四舍五入并将其与数据库值进行比较。您将无法再检测到最小的运动,但至少您也不会再得到误报。

当您使用浮动来存储东西时,您显然并不关心毫米或厘米。

于 2009-08-24T02:10:47.923 回答