大量位置地理编码的策略

Posted

技术标签:

【中文标题】大量位置地理编码的策略【英文标题】:Strategies for large volume of location geocoding 【发布时间】:2010-12-10 13:02:09 【问题描述】:

我有一个应用程序,它使用 Google Maps API 对纬度/经度对之间的距离进行地理编码,以在您的手机上显示您附近的人(目前是​​ android,在 iPhone 上工作)。问题是,即使有 40 个用户的测试组,我们也需要 10 秒以上的时间来进行计算并将结果发送回用户。虽然 10 秒听起来很长,但就客户端应用程序而言,这并不是一个真正的问题,因为它不是人们位置的实时更新(更新每隔几分钟发生一次)。显然这是一个问题,因为我们显然很想增加数万甚至数十万用户。我很好奇是否有其他人在使用 Google Maps API 计算大量数据点之间的距离方面有任何经验?

顺便说一句,我们在服务器上使用 Rails,这是所有位置计算发生的地方。手机只是显示地图并使用纬度/经度坐标更新服务器。

【问题讨论】:

【参考方案1】:

当您已经有了纬度/经度坐标时,您不需要谷歌地图 API 来计算距离。计算great-circle distance 可以使用haversine 或vincenty 公式。

编辑:如果我正确理解您的问题(在 10,000 条记录中找到一个给定位置的附近位置),我只能建议为此目的使用一些地理库。当有更多请求进入时,计算 10k 距离是个坏主意。您绝对应该为此研究更智能的算法(四叉树似乎很实用)。

【讨论】:

【参考方案2】:

看看Geokit,它是一个 Ruby Gem 和 Rails 插件,可以做你想做的事情等等,我想你也会对它的速度和功能感到非常满意。

【讨论】:

实际上,在与我的伙伴讨论这个问题时(他负责服务器工作,我负责电话工作),我们显然已经在使用 GeoKit。如果您保证它的性能,那么我想知道我们对它的使用是否实施不当。不过,在我的搭档的辩护中,我们当时处于非常紧张的最后期限 :) 一组 40 位用户根本不应该花 10 秒的时间来获得结果。肯定有其他东西影响了响应。我有大约 150 行具有纬度和经度的模型,并使用 :origin 作为邮政编码,并按 :distance 排序。我的结果以毫秒为单位返回。 我们正在考虑将其绑定为仅在同一邮政编码中抓取用户,但显然也存在问题(具有多个邮政编码的城市,位于邮政编码边界上)。我们需要想出一种快速的方法来完全基于无边界的方法来过滤掉其他用户。 使用 zipcode 或 lat/lng(如果有的话)作为 :origin,使用 :within 可能达到某个距离阈值(25 英里,或者您确定对用户实用的某个值) ?) ,您可以按 :distance 排序并找到最接近的行。无论如何,只是一些通用的想法。 我也在用geokit,而且没那么长……也许你可以粘贴一些代码?【参考方案3】:

如果您覆盖特定区域,则在进行任何计算之前,您可能需要考虑将经纬度转换为局部等距投影。或者更简单地说,如果覆盖全球区域,则将经纬度转换为两个最近的 UTM 区域,存储两组 X Y 坐标和两个 UTM 区域 ID。然后,您可以先选择 UTM 区域匹配上的记录,然后使用投影坐标对该子集进行计算(这将比计算从 lat long 的距离快得多)。

【讨论】:

以上是关于大量位置地理编码的策略的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你Tableau自定义地理编码(十九)

(七十七)地理编码与反地理编码

反向地理位置:邮政编码问题

地图篇-02.地理编码

iOS 地理编码 / 反地理编码

反向数据编码是啥