使用反向地理位置按距离对列表进行排序

时间:2015-12-22 15:25:13

标签: ios swift ios9 cllocation reversegeocodelocation

我在iOS9上使用Xcode 7。我想根据用户当前位置到列表中所有其他位置的距离对列表进行升序排序。

我不想按坐标计算到某个位置的距离,而是按地址计算,因为距离取决于选择的方法(行驶/步行)。我想要做的就是保存每个位置对象中的地址,以便稍后计算到该对象的距离。

使用对象初始化列表时,我在每个对象的初始值设定项中执行此请求:

let location = CLLocation(latitude: latitude, longitude: longitude) //changed!!!

CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in 
    //the code to obtain an address and save it in a location object is here and works
}

我现在遇到的问题是我必须发送172个这样的reverseGeocodeLocation请求,因为我的列表包含172个对象,我需要计算从用户位置到每个对象位置的距离。

如此快速地发送如此多的请求会导致此错误: 该操作无法完成。 (kCLErrorDomain错误2。)

有没有办法解决这个问题? 如果事情不明确请告诉我,所以我可以澄清

2 个答案:

答案 0 :(得分:3)

Apple的地理编码对象不适用于批量地理编码。有关详细信息,请参阅Xcode中的CLGeocoder类参考。简短摘录:

  

应用程序应该意识到它们如何使用地理编码。天气预报   每个应用的请求都是受限制的,因此请求太多   在短时间内可能会导致某些请求失败。   (超过最大速率时,地理编码器会返回错误   具有值kCLErrorNetwork的对象到关联的完成   处理程序。)以下是使用此类的一些经验法则   有效:

     

为任何一个用户操作发送最多一个地理编码请求。

     

如果用户执行涉及地理编码的多个操作   位置,重新使用初始地理编码请求的结果   启动每项行动的个别请求。

     

如果要自动更新用户的当前位置   (例如当用户移动时),仅发出新的地理编码请求   当用户移动了很长的距离并且在合理的时间之后   时间已经过去了。例如,在典型的情况下,你   不应每分钟发送多个地理编码请求

(我强调的重点。)

摘要是,您不能按照Apple CLGeocoder课程执行的操作。

您只应为用户操作提交单个地理编码请求,然后通常每分钟不会超过一个地理编码请求。

您需要许可第三方地理编码服务(并且可能需要付费)才能进行批量地理编码或反向地理编码。

答案 1 :(得分:1)

我终于在这里的一些评论的帮助下找到了答案。

目前,使用Apple Maps API可以检索的唯一距离是坐标之间的直线距离。但是,如果您想在两个地址或坐标之间计算实际距离,可以通过发送简单请求 with the Google Maps Distance Matrix API 来执行此操作。

实施例

计算距离:51.226531,4.190688
至51.114476,4.139618和51.148123,4.182590。

您可以使用此API调用执行此操作: https://maps.googleapis.com/maps/api/distancematrix/json?origins=51.226531,4.190688&destinations=51.114476,4.139618|51.148123,4.182590

注意我使用3个参数:
json :我想要返回结果的格式
origin :您开始的坐标/地址
目的地:由"分隔的多个坐标/地址| "

这是电话会议的结果:

{
  "destination_addresses" : [
  "Dorpstraat 70, 9140 Temse, België",
  "Eigenlostraat 38, 9100 Sint-Niklaas, België"
],
"origin_addresses" : [ "Provinciale Baan 37, 9120 Beveren, België" ],
"rows" : [
  {
     "elements" : [
        {
           "distance" : {
              "text" : "16,3 km",
              "value" : 16346
           },
           "duration" : {
              "text" : "22 min.",
              "value" : 1321
           },
           "status" : "OK"
        },
        {
           "distance" : {
              "text" : "10,5 km",
              "value" : 10521
           },
           "duration" : {
              "text" : "17 min.",
              "value" : 1003
           },
           "status" : "OK"
        }
     ]
  }
],
"status" : "OK" 
}

如果事情不清楚,请问我!