代码之家  ›  专栏  ›  技术社区  ›  cakeforcerberus

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

  •  2
  • cakeforcerberus  · 技术社区  · 16 年前

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

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

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

    嗯,好吧,所以实际的问题是:我应该如何进行这个比较?我应该从输入的lat/long中截取2个小数位,然后以某种方式进行四舍五入,使第四个数位正确,然后进行比较吗?或者,我是否应该进行“在一定范围内”的比较(例如,报告的loc.long>当前的loc.long-.0001&报告的loc.long<当前的loc.long+.0001)?此外,对于现有的RubyGem/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
    

    谢谢你

    汤姆

    2 回复  |  直到 16 年前
        1
  •  3
  •   Peter    16 年前

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

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

    哪里 tol 是一些预先规定的公差,例如, 0.0001 .

        2
  •  2
  •   Wouter van Nifterick Andrey    16 年前

    一个GPS接收器可以给你一个精确到许多小数点的位置,但这并不意味着测量实际上是那么精确。

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

    但是,当您将GPS日志绘制为在地图上浮动时,您将清楚地注意到舍入误差。

    无论如何,要进行比较,我将使用范围而不是取整传入值并将其与数据库值进行比较。你将无法再检测到最小的动作,但至少你也不会再得到假阳性。

    当你用浮标来储存东西时,你显然不在乎毫米或厘米。

    推荐文章