我正在使用Foursquare API来获取某个类别的场地列表。 一个重要的要求是该清单是详尽的,即包括所有相关点。 v2 /场所/搜索API端点在输出上强制限制50个场地。 因此,首先想到的是将该区域分成几个部分(使用“sw”和“ne”参数),然后将结果组合起来。
显然,点的密度会根据位置而有很大差异,因此我们需要使用某种自适应算法来灵活调整搜索窗口的大小,使其包含所有点。此外,进入速率限制的风险也在增加,因此我们可能需要算法在用完其请求时停止。
最后,似乎判断搜索窗口是否应该进一步缩小的唯一方法是计算结果中的点数:如果我们的数量少于50,那么我们就有了一个完整的列表部分,可以继续下一个;否则,我们应该进一步分裂。这似乎是浪费,因为我们将丢弃中间结果(即除了叶子之外我们的搜索树中的所有结果)。
以下是我的一些问题:
提前致谢!
答案 0 :(得分:10)
一个重要的免责声明是,当你在同一地区进行大量搜索时,foursquare不喜欢它。
话虽如此,您应该在场地搜索API中尝试使用categoryId过滤器。 foursquare上的大部分数据都是食品(餐馆)和夜生活相关。
因此,如果您排除这些(通过包含其他人,无法排除),您可以搜索更大的区域,但仍然可以获得低于50的结果。
从未真正尝试过使用这样的算法,因为categoryId过滤效果不错,但从理论上讲,算法很简单,每个lat / lng 0.001都是~111米。
使用小半径(大城市地区约为200)和三角测量(扫描)区域进行搜索。
让我们最初执行大量搜索(后来又停止这样做)的原因是,有时foursquare会在不问你的情况下过滤掉结果(对我来说,它看起来像bug,因为它们是算法的一部分)。所以例如我会搜索半径50米,找到我想要的地方(我知道我要搜索的是什么),扩展到500米,找不到它(并且得到的结果少于50个 - 因此它没有被删除,因为我打了盖子,它被丢弃了因为???),移动我的搜索位置〜北300米,找到它 - >零星的行为。
我的观点是(以及为什么我们停止进行大量搜索并改变了我们的方法),你想要实现的目标,“完全覆盖”非常很难做到当前API和当前使用政策,以及 - >这真的不重要。经过几个月的玩游戏后,我们发现我们应该查询foursqaure,了解我们的用户正在寻找和需要的内容,此时我们会缓存结果 - 随着时间的推移,我们会完整覆盖,也许一开始我们会错过一些点,但从长远来看,它并不重要。
答案 1 :(得分:1)
希望这不是你正在做的事情,但作为友情提醒:抓住foursquare网站和/或API的服务条款非常禁止。