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

10

我在互联网上到处寻找如何从CLGeocoder获取城市和国家信息。虽然可以轻松获取经度和纬度,但我需要城市和国家信息,而一直遇到过时的方法等问题,有什么想法吗?基本上需要获取位置,然后有一个NSString表示国家,一个NSString表示城市,这样我就可以使用它们来查找更多信息或将它们放在标签上等。

2个回答

18
您需要稍微修改术语——CLGeocoder(以及大多数地理编码器)不会直接提供“城市”信息,而是使用诸如“行政区域”、“次级行政区域”等术语。 CLGeocoder对象将返回一个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类参考


6
好的回答。为了澄清,您可以通过访问CLPlacemark *myPlacemark对象的addressDictionary属性中的“City”键来获取城市名称:即 myPlacemark.addressDictionary[@"City"],但是在阅读文档后应该很明显 :) - manderson
嘿,很酷,谢谢你。是的,我刚看了一下,非常巧妙,遵循地址簿的字段。还有一个很棒的方法可以将完整的地址拼接在一起。谢谢! - Jai Govindani
谢谢。这是一个很好的代码,使用CLGeocoder获取城市名称非常容易和快速实现... - Arpit B Parekh
与地标相关的城市位于“locality”键下。 - halbano

0

你可以使用以下代码(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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接