使用 CoreLocation 获取最近的位置

Posted

技术标签:

【中文标题】使用 CoreLocation 获取最近的位置【英文标题】:Get closest locations with CoreLocation 【发布时间】:2017-12-22 13:31:36 【问题描述】:

我如何才能像 Instagram 一样在发布任何项目之前获取我当前位置的最近位置?我使用 CoreLocation 通过以下代码查找我的当前位置。现在我如何使用这个 CLLocation 信息类来获取最近的位置?或者我还需要哪些其他选项来实现此功能?任何建议都会非常有帮助。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler:  (placemarks, error) -> Void in
        if (error != nil)
            print("LoginView locationManager Error: \(error!.localizedDescription)");
            return
        

        if (placemarks!.count > 0)
            let placemark = placemarks?[0]

            let latitude = String(format: "%f", (placemark?.location?.coordinate.latitude)!)
            let longitude = String(format: "%f", (placemark?.location?.coordinate.longitude)!)
            guard let local = placemark?.locality else  return 
            let uLocation = UserLocation(locality: local, longitude: longitude, latitude: latitude)
            self.userLocations.append(uLocation)
            self.locationContainer.setupData(locations: self.userLocations, delegate: self)
            self.locationManager.stopUpdatingLocation()
        
    )
    locationManager.stopUpdatingLocation()

更新:我决定为此使用适用于 ios 的 Google Places SDK https://developers.google.com/places/ios-sdk/intro。它提供了比 CLLocation 更灵活、更可靠的解决方案。

【问题讨论】:

在询问任何任务之前,您需要进行适当的研发。顺便说一句,您可以通过 google place api 来完成。 【参考方案1】:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler:  (placemarks, error) -> Void in
        if (error != nil)
            print("LoginView locationManager Error: \(error!.localizedDescription)");
            return
        

        if (placemarks!.count > 0)
            let placemark = placemarks?[0]

            let latitude = String(format: "%f", (placemark?.location?.coordinate.latitude)!)
            let longitude = String(format: "%f", (placemark?.location?.coordinate.longitude)!)
            self.addressDecoder.reverseGeocodeLocation(manager.location!, completionHandler: 
                [unowned self] (result, error) in
                guard let address = result else  return 
                let nearbyName = address[0].name ?? address[0].locality
                let uLocation = UserLocation(locality: local, longitude: longitude, latitude: latitude)
                self.userLocations.append(uLocation)
            )
            let uLocation = UserLocation(locality: local, longitude: longitude, latitude: latitude)
            self.userLocations.append(uLocation)
            self.locationContainer.setupData(locations: self.userLocations, delegate: self)
            self.locationManager.stopUpdatingLocation()
         else 
        
    )
    locationManager.stopUpdatingLocation()

我使用 ?? 以防找不到地址,然后使用 locality,就像你现在拥有的一样。使用完成块内的result 来检查可用的其他选项,以防其中一个对您有吸引力。

问候。

【讨论】:

@umutg4d 你试过这个吗? ??

以上是关于使用 CoreLocation 获取最近的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 CoreLocation CLLocationManager 获取过去的位置

iOS项目开发实战——使用CoreLocation获取当前位置信息

是否可以在不使用 CoreLocation 的情况下在 IOS 中获取位置?我们可以使用网络提供商获取它吗?

比一直使用 CoreLocation 获得准确位置的更好方法?

CoreLocation 从坐标获取一定距离和方向的经纬度

iPhone Objective-C CoreLocation:想要使用基于当前位置的数据填充表格