"Имя" 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".