【发布时间】: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