无法使用 CLGeocoder 快速获取正确的城市名称

Posted

技术标签:

【中文标题】无法使用 CLGeocoder 快速获取正确的城市名称【英文标题】:Can't get correct city name in swift with CLGeocoder 【发布时间】:2016-05-09 08:27:50 【问题描述】:

我试图用 swift 获取当前的城市名称和国家名称。 这是我的源代码。 // 然后在 CLLocationManagerDelegate 方法中可以获取用户当前的位置坐标:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    print("locations = \(locValue.latitude) \(locValue.longitude)")
    self.locationManager.stopUpdatingLocation()
    getAddressFromGeocodeCoordinate(manager.location!)



func getAddressFromGeocodeCoordinate(locationObj: CLLocation) 
    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(locationObj, completionHandler:  (placemarks, error) -> Void in

        // Place details
        var placeMark: CLPlacemark!
        placeMark = placemarks?[0]

        // Address dictionary
        print(placeMark.addressDictionary)

        // City
        if let city = placeMark.addressDictionary!["City"] as? NSString 
            print("city:",city)
        

        // Country
        if let country = placeMark.addressDictionary!["Country"] as? NSString 
            print("country", country)
        

    )

但是当我想打印 city 时,它返回 nil。 我也尝试过placeMark.subAdministrativeArea,但它也返回 nil。

我目前在丹东市。

我的代码可以很好地打印国家/地区。像country China 但城市。

谁知道解决办法?

【问题讨论】:

你能给我们一些坐标吗? @JulienQuere Np,纬度 = 40.025411910838,经度 = 124.343855400189 【参考方案1】:

检查是否有任何错误或获取print(placeMark.addressDictionary)的响应是什么

geocoder.reverseGeocodeLocation(newLocation, completionHandler: (stuff, error)->Void in

        if error 
            println("reverse geodcode fail: \(error.localizedDescription)")
            return
        

        if stuff.count > 0 
            self.placemark = CLPlacemark(placemark: stuff[0] as CLPlacemark)

            self.addressLabel.text = String(format:"%@ %@\n%@ %@ %@\n%@",
                self.placemark.subThoroughfare ? self.placemark.subThoroughfare : "" ,
                self.placemark.thoroughfare ? self.placemark.thoroughfare : "",
                self.placemark.locality ? self.placemark.locality : "",
                self.placemark.postalCode ? self.placemark.postalCode : "",
                self.placemark.administrativeArea ? self.placemark.administrativeArea : "",
                self.placemark.country ? self.placemark.country : "")
        
        else 
            println("No Placemarks!")
            return
        

        )

【讨论】:

以上是关于无法使用 CLGeocoder 快速获取正确的城市名称的主要内容,如果未能解决你的问题,请参考以下文章

仅以英文获取 CLGeocoder 值

CLGeoCoder 未按正确顺序附加地标

仅以英文获取用户的城市

使用 CLGeocoder 将城市和州信息添加到 MKAnnotation

获取 CLGeocoder 返回的确切州/省字符串

当城市名称等于某个国家/地区的名称(不仅如此)时,CLGeocoder 返回错误的结果