Программно / вручную создать MKPlacemark / CLPlacemark

Задача

У меня есть набор информации о метках (страна, город и т. Д.) И пара широты и долготы. Я хотел бы использовать это для создания объекта MKPlacemark.


Обсуждение

Похоже, что этот класс может быть создан только

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary

, в документации которого указано

Вы можете вручную создавать объекты меток для объектов, для которых у вас уже есть адресная информация, например, контакты в адресной книге . Создание объекта метки явно исключает необходимость запрашивать ту же информацию у объекта обратного геокодера.

Отлично! Я уже выполнил обратное геокодирование и хочу избежать такого запроса. Что я могу добавить в словарь?

Список строк, которые можно использовать для ключей этого словаря, см. В константах «Свойство адреса» в справочнике ABPerson. Все ключи должны находиться на верхнем уровне словаря.

В котором показаны соответствующие ключи.

const ABPropertyID kABPersonAddressProperty;
const CFStringRef kABPersonAddressStreetKey;
const CFStringRef kABPersonAddressCityKey;
const CFStringRef kABPersonAddressStateKey;
const CFStringRef kABPersonAddressZIPKey;
const CFStringRef kABPersonAddressCountryKey;
const CFStringRef kABPersonAddressCountryCodeKey;

Это совсем не соответствует базовым характеристикам MKPlacemark:

Доступ к данным местоположения

  • свойство местоположения

Доступ к атрибутам метки

  • имя свойство
  • addressDictionary свойство
  • свойство ISOcountryCode
  • свойство страны
  • свойство postalCode
  • свойство административной области
  • свойство subAdministrativeArea
  • свойство местоположения
  • свойство subLocality
  • свойство проезжей части
  • свойство subThoroughfare
  • регион свойство

Доступ к географической информации

  • свойство inlandWater
  • свойство океана

Доступ к информации об ориентире

  • свойство areaOfInterest

К счастью, в фактическом файле заголовка суперкласса MKPlacemark кое-что говорится о словаре адресов:

// address dictionary properties

@property (nonatomic, readonly) NSString *name; // eg. Apple Inc.

@property (nonatomic, readonly) NSString *thoroughfare; // street address, eg. 1 Infinite Loop

@property (nonatomic, readonly) NSString *subThoroughfare; // eg. 1

@property (nonatomic, readonly) NSString *locality; // city, eg. Cupertino

@property (nonatomic, readonly) NSString *subLocality; // neighborhood, common name, eg. Mission District

@property (nonatomic, readonly) NSString *administrativeArea; // state, eg. CA

@property (nonatomic, readonly) NSString *subAdministrativeArea; // county, eg. Santa Clara

@property (nonatomic, readonly) NSString *postalCode; // zip code, eg. 95014

@property (nonatomic, readonly) NSString *ISOcountryCode; // eg. US

@property (nonatomic, readonly) NSString *country; // eg. United States

@property (nonatomic, readonly) NSString *inlandWater; // eg. Lake Tahoe

@property (nonatomic, readonly) NSString *ocean; // eg. Pacific Ocean

@property (nonatomic, readonly) NSArray *areasOfInterest; // eg. Golden Gate Park

Итак, я создаю словарь и передаю его так:

return [[[MKPlacemark alloc] initWithCoordinate:aLocation.coordinate addressDictionary:addressDictionary] autorelease];

К сожалению, после всего этого интроспекция показывает, что информация не прижилась:

NSLog(@"placemark %@ from %@", placemark, addressDictionary);
NSLog(@"has %@", placemark.thoroughfare);

Печать

2012-01-31 20:14:22.545 [15450:1403] placemark <+___,-___> +/- 0.00m from {
administrativeArea = __;
postalCode = _____;
subAdministrativeArea = ___;
subThoroughfare = __;
thoroughfare = "_____";
}
2012-01-31 20:14:22.545[15450:1403] has (null)

Заключение

Итак, я нахожусь в конец здесь. Кто-нибудь придумал, как создать свой MKPlacemark? Спасибо.

12
задан Rob Keniger 2 February 2012 в 01:20
поделиться