从 CLGeocoder 获取当前城市和国家?

Posted

技术标签:

【中文标题】从 CLGeocoder 获取当前城市和国家?【英文标题】:Get current city and country from CLGeocoder? 【发布时间】:2013-01-12 15:11:22 【问题描述】:

我一直在互联网上试图找出如何从CLGeocoder 获得城市和国家。我可以轻松获得经度和纬度,但我需要城市和国家/地区信息,而且我不断遇到不推荐使用的方法等,有什么想法吗?它基本上需要获取位置,然后有一个NSString 代表国家,NSString 代表城市,所以我可以使用它们来查找更多信息或将它们放在标签上等。

【问题讨论】:

【参考方案1】:

您需要稍微修改一下您的术语 - CLGeocoder(和大多数地理编码器)本身不会给您一个“城市” - 它使用诸如“行政区”、“子行政区”等术语。CLGeocoder object 将返回一个 CLPlacemark 对象数组,然后您可以查询所需的信息。您初始化 CLGeocoder 并使用位置和完成块调用 reverseGeocodeLocation 函数。这是一个例子:

    if (osVersion() >= 5.0)

    CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];

    [reverseGeocoder reverseGeocodeLocation:self.currentLocation completionHandler:^(NSArray *placemarks, NSError *error)
     
         DDLogVerbose(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
         if (error)
             DDLogError(@"Geocode failed with error: %@", error);
             return;
         

         DDLogVerbose(@"Received placemarks: %@", placemarks);


         CLPlacemark *myPlacemark = [placemarks objectAtIndex:0];
         NSString *countryCode = myPlacemark.ISOcountryCode;
         NSString *countryName = myPlacemark.country;
         DDLogVerbose(@"My country code: %@ and countryName: %@", countryCode, countryName);

     ];
    

现在请注意,CLPlacemark 没有“城市”属性。完整的属性列表可以在这里找到:CLPlacemark Class Reference

【讨论】:

很好的答案。澄清一下,您可以通过访问CLPlacemark *myPlacemarkobject 的addressDictionary 属性中的“City”键来获取城市名称:即myPlacemark.addressDictionary[@"City"],但这在阅读您提到的文档后应该很明显:) 嘿,很酷,谢谢你 - 是的,看起来很漂亮,遵循地址簿的字段。还有一种很酷的方法可以拼凑完整的地址。谢谢! 谢谢这是一个很好的获取城市名称的代码,使用CLGeocoder,实现起来非常简单快捷... 与地标关联的城市在“locality”键下。【参考方案2】:

您可以使用此 (Swift 5) 获取城市、国家和 iso 国家/地区代码:

private func getAddress(from coordinates: CLLocation) 
    CLGeocoder().reverseGeocodeLocation(coordinates)  placemark, error in
        guard error == nil,
            let placemark = placemark
        else
        
            // TODO: Handle error
            return
        

        if placemark.count > 0 
            let place = placemark[0]
            let city = place.locality
            let country = place.country
            let countryIsoCode = place.isoCountryCode
        
    

【讨论】:

以上是关于从 CLGeocoder 获取当前城市和国家?的主要内容,如果未能解决你的问题,请参考以下文章

仅以英文获取 CLGeocoder 值

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

CLGeocoder 反向地理编码失败,错误域=NSURLErrorDomain 代码=-1000 -

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

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

微信小程序实现城市定位:获取当前所在的国家城市信息