Получить текущий город и страну от CLGeocoder?

Я был в Интернете, пытаясь выяснить, как получить город и страну от CLGeocoder, Я легко могу получить долготу и широту, но мне нужна информация о городе и стране, и я продолжаю сталкиваться с устаревшими методами и тому подобным, есть идеи? Это в основном нужно, чтобы получить местоположение, а затем иметь NSString для страны, и NSString для города, так что я могу использовать их, чтобы найти больше информации или разместить их на этикетках и т. д.

1 ответ

Решение

Вам нужно немного пересмотреть свою терминологию - 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 не имеет свойства 'city'. Полный список свойств можно найти здесь: CLPlacemark Class Reference

Вы можете получить код города, страны и ISO страны, используя это (Swift 5):

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
        }
    }
}
Другие вопросы по тегам