【问题标题】:Floating point calculations with latitudes and longitudes of varying precisions具有不同精度的纬度和经度的浮点计算
【发布时间】:2009-08-24 01:25:59
【问题描述】:

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

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

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

唷,好的,所以实际的问题是:我应该如何进行这种比较?我是否应该从传入的纬度/经度中截断小数点后 2 位,以某种方式四舍五入,以便第四位正确,然后进行比较?或者,我应该进行“一定范围内”的比较(例如,reported_loc.long > current_loc.long - .0001 && reported_loc.long

这是日志的示例输出:

[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

谢谢

汤姆

【问题讨论】:

    标签: ruby floating-point geocoding geokit


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 2011-08-16
        • 2010-09-28
        • 2015-05-17
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多