Проблемы с обратным геокодированием для названия города в iOS

Я могу получить текущее местоположение в своем приложении для iPad, используя

CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue]   longitude:[longitude floatValue]];
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
     {

         NSLog(@"-----------------Placemark is %@-----------------", placemarks);

          locationLabel.text = placemarks;

     }];

и выход,

-----------------Placemark is ("South Atlantic Ocean, South Atlantic Ocean @<-42.60533670,-21.93128480> +/- 100.00m,    region (identifier <-41.51023865,-31.60774370> radius 4954476.31) <-41.51023865,-31.60774370> radius 4954476.31m"
)-----------------

Могу ли я использовать ту же информацию, чтобы просто получить название города и страны? вместо длинного списка информации?

Кроме того, «locationLabel.text = placemarks» выдает предупреждение «Несовместимые типы указателей, назначенные для« NSString * »из« NSArray * _strong », которые я не могу разрешить.


person Breakpoint    schedule 25.06.2012    source источник


Ответы (2)


Да, можете.
Но вы делаете это немного неправильно. Во-первых, placemarks — это массив, а не строка. Вот почему locationLabel.text = placemarks выдает предупреждение.

Placemarks — это массив CLPlacemarks. . Это связано с тем, что геокодер может возвращать несколько результатов для одной координаты. В самом простом условии первый элемент в нем должен быть в порядке.

CLPlacemark имеет свойство addressDictionary, которое содержит данные об этом местоположении. Вы можете получить доступ к этим данным с помощью констант свойств адреса, определенных в ABPerson.

Например:

Получить первую метку из массива:

CLPlacemark *place = [placemarks objectAtIndex:0];

затем получите город с этой метки:

NSString *cityName = [place objectForKey: kABPersonAddressCityKey];

Не забудьте импортировать заголовок AVPerson!

person yinkou    schedule 25.06.2012
comment
спасибо yinkou, я понял свою ошибку после того, как написал! почему локация загружается какое-то время, секунда-две? - person Breakpoint; 25.06.2012

вы можете получить все следующие детали места

        placeNameLabel.text     = [placemarks[0] name];
        addressNumberLabel.text = [placemarks[0] subThoroughfare];
        addressLabel.text       = [placemarks[0] thoroughfare];
        neighborhoodLabel.text  = [placemarks[0] subLocality];
        cityLabel.text          = [placemarks[0] locality];
        countyLabel.text        = [placemarks[0] subAdministrativeArea];
        stateLabel.text         = [placemarks[0] administrativeArea];
        zipCodeLabel.text       = [placemarks[0] postalCode];
        countryLabel.text       = [placemarks[0] country];
        countryCodeLabel.text   = [placemarks[0] ISOcountryCode];
        inlandWaterLabel.text   = [placemarks[0] inlandWater];
        oceanLabel.text         = [placemarks[0] ocean];
person Yi Jiang    schedule 03.09.2013