我有一个非常规的想法给你。当您第一次想到它时,这将是非常非常奇怪的,因为它的执行顺序与您期望的完全相反。但是,您可能会看到其中的逻辑。
为了将其付诸实施,您需要一个广泛类别的内容,您希望用户看到这些内容。例如,我将选择“超市”。
作为谷歌地方的一部分,有一个很棒的 API,称为 nearSearch。它真正的奇迹是允许您按距离对地点进行排名。我们将利用这一点。
先决条件
- 修改您的数据库并存储在附近搜索地点返回的唯一 ID。这不违反 ToS,我们需要这个
- 获取这些 ID 的列表。
计划
当您获得用户的位置时,查询附近搜索您的类别,并使用以下约束循环遍历结果:
- 如果结果的 ID 与您的数据库中的某些内容匹配,那么您就有了该结果。奖励#1:它按距离升序排序!奖励 #2:您已经获得了 lat-loc!
- 如果结果的 ID 不匹配,您可以静默地跳过它或使用它并将其添加到您的数据库中。这意味着您可以毫不夸张地即时更新您的数据库,而无需手动工作作为额外的奖励。
完成请求后,您将获得从未出现在结果中的 ID。计算谷歌数据中最远结果的点对点距离,您将获得与您的点的最大距离。如果这太小,请使用我在此处描述的技术进行复合搜索。
唯一的要求是:您需要大致了解要搜索的内容。但是,请考虑这一点:您的正常查询周期会将您带到 1 到 100 个 google 查询之间。我的方法在 50 公里半径范围内取 1。:-)
顺便说一下,要计算距离,您将需要 Haversine 的公式,而不是进行邮政编码查找。这具有真正国际化的额外优势。
重要警告
这种搜索方式直接取决于你所知道的地点和距离之间的权衡。如果您正在寻找小于 10 公里的半径,请使用此方法仅生成一个请求。
但是,如果您必须进行复合搜索,请记住每个请求周期将花费您 3N,其中 N 是上一个周期生成的查询数。因此,如果您在 100 公里半径内只有 3 个地点,则单独查找每个地点更有意义。