【问题标题】:Foursquare venue search API returns out-of-radius resultsFoursquare 场地搜索 API 返回超出范围的结果
【发布时间】:2014-08-16 15:42:50
【问题描述】:

我在keizersgrachtAmsterdam 拍了一张照片。我正在构建一个功能,如果照片的位置和 Foursquare 场地之间存在严格匹配,我会包含一个拍摄照片的位置。否则,我希望结果是nil。

我正在进行的 Foursquare API 调用的文档可以在这里找到:https://developer.foursquare.com/docs/venues/search

由于我不知道这张照片是在什么样的场地拍摄的,所以我无法添加query 参数,它从选项中排除了intent=match。作为一种解决方法,我选择使用 intent=checkin 并将几乎所有 categoryId's 添加到请求中。

我的请求现在看起来像这样:

//latitude & longitude are taken as parameters to the method
NSString *clientId = @"redacted";
NSString *clientSecret = @"redacted";
NSString *version =@"20140806";
NSString *limit = @"1";
NSString *radius = @"1";
NSString *categoryId = @"4d4b7104d754a06370d81259,4bf58dd8d48988d1b4941735,4bf58dd8d48988d1b2941735,4bf58dd8d48988d1a8941735,4bf58dd8d48988d1ad941735,4d4b7105d754a06373d81259,4d4b7105d754a06374d81259,4d4b7105d754a06376d81259,4d4b7105d754a06377d81259,4d4b7105d754a06375d81259,4e67e38e036454776db1fb3a,4d4b7105d754a06378d81259,4d4b7105d754a06379d81259"; //almost all the cat id's

NSDictionary *venueResponse = [self getDataFrom:[NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?client_id=%@&client_secret=%@&v=%@&ll=%@,%@&m=foursquare&limit=%@&radius=%@&intent=checkin&categoryId=%@", clientId, clientSecret, version, lat, lng, limit, radius, categoryId]];
NSLog(@"%@",venueResponse);

getDataFrom 方法是关于发出一个简单的 GET 请求。

但是,当我经过阿姆斯特丹市中心的某个位置时,我得到了超出半径范围的结果,如下所示:(sn-p)

cc = NL;
                    city = Amsterdam;
                    country = Netherlands;
                    distance = 24;
                    formattedAddress =                     (
                        Amsterdam,
                        Netherlands
                    );

这很奇怪,因为我特地添加了半径 1。

这是什么原因造成的,我该怎么办?

【问题讨论】:

  • 您知道距离和半径值以米为单位吗?
  • 我是。所以这实际上意味着它们是相同的值..

标签: ios objective-c geolocation foursquare


【解决方案1】:

我建议放弃半径参数。您的设备有一个位置。与其构造一个半径如此之小(你的 iPhone 的位置精度不太可能达到 1 米)和这么多类别的请求,你可以询问可能的附近位置(intent=checkin 确实如此) ) 并简单地枚举返回的数据以找到距离您的设备位置最近的位置(正如@Acey 提到的那样)。您可以使用 Core Location 中提供的 API 或使用每个紧凑场地返回的距离自行计算。如果您不使用半径参数,则不需要包含 categoryIds 或查询。 (另外,由于 iPhone 上的定位精度可能会有所不同,您肯定会有一些情况需要解决!):)

此外,如果该应用仅适用于某一特定类别地点(例如咖啡店)的照片,那么在 GET 请求中请求该 categoryId 是有意义的。除非我有误解,否则您似乎包含 categoryIds 只是因为您认为需要包含半径参数,我认为这没有必要。

如果您希望特定用户的“最佳”匹配,您需要允许该用户使用其 Foursquare 帐户进行身份验证。 Foursquare 将返回“最佳”匹配的场地,该场地可能至少基于他们的签到历史。

此外,如果您在应用中保留这些数据并且不想向 Foursquare 提供身份验证,则可以使用用户累积的数据在设备上创建自己的算法,以帮助确定用户所在的位置当他们拍摄未来的照片时。

祝您构建应用程序好运。似乎是一个巧妙的想法,需要考虑一些很好的挑战。

【讨论】:

    【解决方案2】:

    结果中的距离值是到该位置中心的距离。就阿姆斯特丹而言,该位置足够大,以至于它的一部分位于您所在位置的 1 英里范围内。想想重叠的圆圈。中心之间的距离可能大于 1,但从您的圆圈到该位置任何部分的距离实际上是 0。

    我猜你得到的结果集包含多个地方。我会查看结果并选择距离最短的场地,这应该会给您最准确的场地。

    【讨论】:

    • 你所说的“圆圈”是什么意思?我以为那是我设置的半径..
    • 您通过指定点和半径(圆的组成部分)来提供搜索区域。您返回的样本位置的区域与该区域重叠,因此即使该位置的中心距离超过 1m,也会返回。
    • 嗯,好的,谢谢。我其实不想那样。你知道如何用当前数据解决这个问题吗?我可以在某个地方指定另一个位置的半径吗?
    • 实际上,如果中心不在半径范围内,我希望结果是nil。你可能知道我可以为intent=match 解决的一些解决方法吗?我讨厌使用简单的if 语句,因为foursquare 不会首先返回最佳匹配。
    • 请仔细阅读我的问题和文档。我不知道这个查询。我唯一知道的是ll。此外,让我引用文档:query and ll are the only required parameters for this intent, but matching also supports phone, address, city, state, zip, and twitter.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多