【问题标题】:How to quickly determine if multiple places are within users vicinity - Google Places API如何快速确定用户附近是否有多个地方 - Google Places API
【发布时间】:2012-06-01 05:12:46
【问题描述】:

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

以下是我目前使用的流程的广泛概述 -

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

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

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

谢谢。

【问题讨论】:

  • 您的数据库中有哪些信息?拉特灵?地名?
  • 我只存储地名,以及其他一些无关紧要的细节。比如说百思买。我想说,好吧,你住在奥马哈内布拉斯加州,你附近有这些百思买。下一个地方是Office Max,奥马哈没有Office Max,所以不要显示任何东西。并继续浏览所有仅显示与您的位置相关的地方。
  • 嗯,这是我决定暂时使用的解决方案:我决定只为美国排名前 275 的城市(即所有人口超过 10 万的城市)提供服务。我有一个城市及其坐标的数据库。每天晚上我都会运行一个脚本,用该城市附近的地方数量更新数据库。因此,我将能够查找 Phoenix AZ,并列出所有计数高于 0 的地方。如果用户不在前 275 个城市之一,我将向他们显示离他们所在位置最近的城市。我认为这应该适用于我的应用程序。
  • 我不确定您打算运行哪种类型的脚本,但如果它自动将搜索请求放在设定的位置,它可能会被标记,并且您对该项目的 API 的访问权限将停止。在实施您的解决方案之前,只需检查Google Maps Terms of Service
  • (b) 不预取、缓存或存储内容。您不得预取、缓存或存储任何内容,除非您可以存储:(i) 有限数量的内容,以提高 Maps API 实施的性能,前提是您临时、安全且在不允许在服务之外使用内容的方式; (ii) Maps API 文档明确允许您存储的任何内容标识符或密钥。例如,您不得使用内容创建独立的“地点”数据库或其他本地列表信息。

标签: php javascript google-places-api


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    先决条件

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

    计划

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

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

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

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

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

    重要提示

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

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

    【讨论】:

    • (只是补充一下 - 这 与 Google 的 ToS 兼容 - 您唯一需要存储的是唯一 ID 引用)
    • 投反对票的人真的可以说为什么他们这样做了吗?
    猜你喜欢
    • 2017-06-12
    • 2020-08-28
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多