反向地理编码从纬度,经度数组中仅返回一个地址

问题描述 投票:0回答:2

我有一个CLLocationCoordinates2D数组,并设置了一个for循环来调用函数get_addres_from_geoCoder,但此函数仅打印一个地址,而CLLocationCoordinates2D数组具有18个值(纬度,长整数)

override func viewDidLoad() {
  super.viewDidLoad()

  for a in My_rides_Pick_locatio
  {
     let loc =       CLLocationCoordinate2D(latitude:a.latitude,longitude: a.longitude)

     self.get_addres_from_geoCoder(loc:  loc)
  }
func get_addres_from_geoCoder(loc : CLLocationCoordinate2D) {


            let location: CLLocation =  CLLocation(latitude: loc.latitude, longitude: loc.longitude)

            geo.reverseGeocodeLocation(location as CLLocation, preferredLocale: nil) { (clPlacemark: [CLPlacemark]?, error: Error?) in
                guard let place = clPlacemark?.first else {
                    print("No placemark from Apple: \(String(describing: error))")
                    return
                }

                    print("----")
                    print(place.compactAddress!)

            }
    }
}

结果


巴基斯坦拉瓦尔品第市集市路

ios arrays swift google-maps reverse-geocoding
2个回答
0
投票

这是Apple的限制。请参阅文档。

讨论此方法将指定的位置数据异步提交到地理编码服务器并返回。请求完成后,地理编码器将在主线程上执行提供的完成处理程序。

发起反向地理编码请求后,请勿尝试发起另一个反向地理编码或正向地理编码请求。地理编码请求受每个应用程序的速率限制,因此在短时间内提出过多请求可能会导致某些请求失败。当超出最大速率时,地理编码器会将值CLError.Code.network的错误对象传递给完成处理程序。


0
投票

克里斯在上一个答案中是正确的,您不应该对带有大量请求的Apple地理编码服务进行“垃圾邮件”处理,因为某些请求可能会被丢弃。但是在这种情况下,我不确定这是否是正在发生的事情,好像每个失败的事件都会触发您的警卫条款(因为即使根据文档删除了请求,仍会调用完成处理程序),并且您该错误消息将被打印17次。

几乎好像goecoding服务即使已经处于活动状态也不会接受请求。我刚刚完成的一些简短测试(因为它与我的一个项目相关,并且我想确保自己理解),似乎可以确认,因为它只会返回对提交的第一个坐标的响应,而从不返回错误对于后续的。

因此,在您的方案中,更好的方法是使用迭代方法,对完成处理程序中的其余位置启动反向地理编码:

let geo = CLGeocoder()

func reverse(locs: [CLLocation], number: Int = 1){
   guard !locs.isEmpty else {
      print("All Done")
      return
   }
   geo.reverseGeocodeLocation(locs.first!){ placemarks, error in
      print("-------------- \(number) -------------")
      if let error = error {
         print("Error \(error)")
      } else if let placemark = placemarks?.first {
         print("place: \(placemark)")
      }
      reverse(locs: Array(locs.dropFirst()), number: number + 1)
   }
}

number参数和prints语句就在其中,因此您可以轻松查看正在发生的情况,需要将其从任何最终代码库中删除。

就像一个简单的演示如何使用它,下面有一个示例。我已经在测试中成功处理了20个位置的数组。

let c1 = CLLocation(latitude: 51.5074, longitude: 0.1278)
let c2 = CLLocation(latitude: 52.5074, longitude: -0.1278)
let c3 = CLLocation(latitude: 53.5074, longitude: -0.1378)
let c4 = CLLocation(latitude: 54.5074, longitude: -0.1578)
let c5 = CLLocation(latitude: 55.5074, longitude: -0.1778)

let c = [c1, c2, c3, c4, c5]

reverse(locs: c)
© www.soinside.com 2019 - 2024. All rights reserved.