2

我正在设计一个网络应用程序,我需要确定我的数据库中列出的哪些地方在用户的行驶距离内。

这是我目前正在使用的过程的广泛概述 -

  1. 通过 Google 的 map api 获取用户当前位置
  2. 遍历我的数据库中的每个地方(大约 100 个),使用 google places api 检查该地方是否在用户驾驶距离之内。我返回并使用 PHP 解析 JSON 文件,以查看在给定用户坐标的情况下是否存在任何位置。
  3. 如果地点在用户驾驶距离显示顶部位置(谷歌地点限制为 20 个),否则不显示

当我跑过几个地方时,这个过程工作得很好,但是跑过 100 个地方要慢得多,并且会进行 100 次 api 调用。根据 Google 目前每天 100,000 次通话的限制,这可能会成为未来的问题。

那么有没有更好的方法来确定我的数据库中的哪些地方在用户的驾驶距离之内?我不想跟踪我的数据库中的地址,我想依靠谷歌。

谢谢。

4

2 回答 2

0

您可以使用此处找到的公式来计算邮政编码之间的距离:

http://support.sas.com/kb/5/325.html

这并不精确(门阶到门阶),但您可以计算从用户的邮政编码到该位置的邮政编码的距离。

使用这种方法,您甚至不必访问 Google 的 API。

于 2013-04-23T17:59:59.890 回答
-1

我有一个非常规的想法给你。当您第一次想到它时,这将是非常非常奇怪的,因为它的执行顺序与您期望的完全相反。但是,您可能会看到其中的逻辑。

为了将其付诸实施,您需要一个广泛类别的内容,您希望用户看到这些内容。例如,我将选择“超市”。

作为谷歌地方的一部分,有一个很棒的 AP​​I,称为 nearSearch。它真正的奇迹是允许您按距离对地点进行排名。我们将利用这一点。

先决条件

  • 修改您的数据库并存储在附近搜索地点返回的唯一 ID。这不违反 ToS,我们需要这个
  • 获取这些 ID 的列表。

计划

当您获得用户的位置时,查询附近搜索您的类别,并使用以下约束循环遍历结果:

  • 如果结果的 ID 与您的数据库中的某些内容匹配,那么您就有了该结果。奖励#1:它按距离升序排序!奖励 #2:您已经获得了 lat-loc!
  • 如果结果的 ID 不匹配,您可以静默地跳过它或使用它并将其添加到您的数据库中。这意味着您可以毫不夸张地即时更新您的数据库,而无需手动工作作为额外的奖励。

完成请求后,您将获得从未出现在结果中的 ID。计算谷歌数据中最远结果的点对点距离,您将获得与您的点的最大距离。如果这太小,请使用我在此处描述的技术进行复合搜索。

唯一的要求是:您需要大致了解要搜索的内容。但是,请考虑这一点:您的正常查询周期会将您带到 1 到 100 个 google 查询之间。我的方法在 50 公里半径范围内取 1。:-)

顺便说一下,要计算距离,您将需要 Haversine 的公式,而不是进行邮政编码查找。这具有真正国际化的额外优势。

重要警告

这种搜索方式直接取决于你所知道的地点和距离之间的权衡。如果您正在寻找小于 10 公里的半径,请使用此方法仅生成一个请求。

但是,如果您必须进行复合搜索,请记住每个请求周期将花费您 3N,其中 N 是上一个周期生成的查询数。因此,如果您在 100 公里半径内只有 3 个地点,则单独查找每个地点更有意义。

于 2013-04-23T18:33:54.850 回答