如何快速确定用户附近是否有多个地点 - Google 地方信息API.


How to quickly determine if multiple places are within users vicinity - Google Places API

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

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

  1. 通过谷歌的地图API获取用户的当前位置
  2. 使用谷歌地点 API 运行我的数据库中的每个地方(大约 100 个),检查该地点是否在用户的行驶距离内。 我返回并使用 PHP 解析 JSON 文件,以查看给定用户坐标时是否存在任何位置。
  3. 如果地点在用户行驶距离内显示顶级位置(谷歌地点限制为 20 个),其他明智的不显示

当我运行少数几个地方时,此过程工作正常,但运行 100 个地方要慢得多,并且会进行 100 次 api 调用。 由于谷歌目前每天限制100,000个电话,这可能会成为一个问题。

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

谢谢。

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

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

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

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

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

为了将其付诸行动,您需要一类希望用户看到的广泛类别的内容。例如,我要去"超市"。

有一个很棒的API作为谷歌地方的一部分,叫做附近搜索。它真正的奇迹是允许您按距离对地点进行排名。我们将利用这一点。

先决条件

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

A. 计划

获取用户的位置后,在附近查询搜索您的类别,并使用以下约束循环浏览结果:

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

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

唯一的要求是:您需要大致知道您要搜索的内容。但是,请考虑一下:您的正常查询周期需要您进行 1 到 100 次 google 查询。我的方法在 50 公里半径内取 1。:-)

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

重要注意事项

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

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