"Имя" CLPlacemark

Я пытаюсь понять CLPlacemark и когда / как создать информацию для выноски контакта, который добавляется на карту. Перед тем, что я читал в разделе "Разработка для iOS 3" несколько лет назад, они геокодировали обратный адрес и строили адрес (улица, почтовый индекс, штат и т. Д.). Во-первых, мне нужно построить эту строку самостоятельно? Я пытался узнать, как получить название местоположения для определенных известных вещей, таких как поиск магазина Apple, в приведенном ниже коде:

NSString *address = @"1 stockton, san francisco, ca";    
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {

    [placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj description: %@", [obj description]);

        CLPlacemark *aPlacemark = (CLPlacemark *)obj;
        NSLog(@"%@", [aPlacemark.addressDictionary description]);
        NSLog(@"name: %@", ((CLPlacemark *)obj).name);
    }];
];

Когда я распечатываю описание, я вижу, что Консоль говорит:

Apple Store, San Francisco, 1 Stockton St, San Francisco, CA  94108-5805, United States @ <+37.78584545,-122.40651752> +/- 100.00m, region (identifier <+37.78584545,-122.40652161> radius 18.96) <+37.78584545,-122.40652161> radius 18.96m

Откуда он берет Apple Store, Сан-Франциско, имя? Я думал, что это будет свойство CLPlacemark.name, но это ноль. Поэтому, пытаясь выяснить, как создается свойство name, я обнаружил:

        NSLog(@"%@", [aPlacemark.addressDictionary description]);

Я получаю вывод:

City = "San Francisco";
Country = "United States";
CountryCode = US;
FormattedAddressLines =     (
    "Apple Store, San Francisco",
    "1 Stockton St",
    "San Francisco, CA  94108-5805",
    "United States"
);
PostCodeExtension = 5805;
State = California;
Street = "1 Stockton St";
SubAdministrativeArea = "San Francisco";
SubLocality = "Union Square";
SubThoroughfare = 1;
Thoroughfare = "Stockton St";
ZIP = 94108;

Из этого все, что я могу видеть, это то, что в ключе FormattedAddressLines addressDictionary, заголовок также там.

Итак, я думаю, что мои 2 вопроса:

1) Как я могу получить название местоположения, если оно есть (например, Apple Store)?

2) Нужно ли мне строить свою строку, так как кажется, что адресный словарь уже делает это для меня?

Спасибо!

2 ответа

Решение

Чтобы ответить на ваш первый вопрос, используйте areasOfInterest свойство CLPlacemark.

Что касается второго вопроса, это действительно ваше дело, и как вы хотите отформатировать строку. Если вы хотите построить его, используя строки из addressDictionary собственности, то непременно сделай так. Вы можете выбрать части и создать строку в обработчике завершения.

Также вы упомянули, что хотите создать аннотацию для отображения на карте. Я лично делю на подклассы MKAnnotation и использую его для быстрого создания аннотации для отображения на карте.

MyAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject <MKAnnotation> {
    NSString *_name;
    NSString *_address;
    CLLocationCoordinate2D _coordinate;
}

@property (copy) NSString *name;
@property (copy) NSString *address;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate;

@end

MyAnnotation.m

#import "MyAnnotation.h"

@implementation MyAnnotation
@synthesize name = _name;
@synthesize address = _address;
@synthesize coordinate = _coordinate;

- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate
{
    if ((self = [super init])) {
        _name = [name copy];
        _address = [address copy];
        _coordinate = coordinate;
    }
    return self;
}

- (NSString *)title
{
    return _name;
}

- (NSString *)subtitle
{
    return _address;
}

@end

Объявите NSMutableArray для хранения всех аннотаций и бросьте initWithName:address:coordinate: в вашем обработчике завершения, и вы можете быстро получить массив аннотаций, которые вы можете добавить к своей карте.

NSString *address = @"1 stockton, san francisco, ca";    
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) 
{
   NSMutableArray *annotationArray = [NSMutableArray array];
   for (CLPlacemark *aPlacemark in placemarks)
   {
      NSString *nameString = // Get your name from an array created by aPlacemark.areasOfInterest;
      NSString *addressString = // Put your address string info you get from the placemark here.
      CLLocationCoordinate2D coordinate = aPlacemark.location.coordinate;
      MyAnnotation *annotation = [[MyAnnotation alloc] initWithName:nameString address:addressString coordinate:coordinate];
      [annotationArray addObject:annotation];
   }
   // Now save annotationArray if you want to use it later
   // Add it to your MapView with [myMapView addAnnotations:annotationArray];
}];

Надеюсь, это поможет!

Вы можете использовать функцию ABCreateStringWithAddressDictionary из структуры AddressBookUI, чтобы получить строку адреса из свойства CLPlacemark "addressDictionary".

Другие вопросы по тегам