Объект делегата, относящийся к классу MKMapView, должен соответствовать протоколу MKMapViewDelegate и реализовывать метод mapView: viewForAnnotation:. Возвращаемое значение этого метода является экземпляром класса MKAnnotationView. Любой объект, являющийся подклассом вышеупомянутого класса, по умолчанию наследует свойство image. Если присвоить этому свойству такое значение, то мы заменим стандартное значение, предоставляемое во фреймворке Map Kit. Результат показан на рис. 9.4.
Рис. 9.4. Наше собственное изображение, показанное в картографическом виде
См. также
Раздел 9.5.
9.7. Преобразование обычных адресов в данные широты и долготы
Постановка задачи
Имеется адрес определенного места, необходимо найти его географические координаты (
Решение
Воспользуйтесь методом geocodeAddressString: completionHandler: из класса CLGeocoder.
Обсуждение
Пространственное местоположение геокодируется путем передачи адреса в формате NSString методу geocodeAddressString: completionHandler:, относящемуся к классу CLGeocoder. Параметр completionHandler этого метода принимает блоковый объект, не возвращающий никакого значения и имеющий два параметра:
• массив меток (типа NSArray). Метками будут обозначены те точки на карте, которые соответствуют критериям поискового запроса;
• ошибку (типа NSError), которая будет преобразована в код ошибки, если геокодирование не удастся.
Итак, сначала объявим свойство типа CLGeocoder:
#import «ViewController.h»
#import
@interface ViewController ()
@property (nonatomic, strong) CLGeocoder *myGeocoder;
@end
@implementation ViewController
Идем дальше. Реализуем код для геокодирования адреса:
— (void)viewDidLoad{
[super viewDidLoad];
/* У нас есть адрес. */
NSString *oreillyAddress =
@"1005 Gravenstein Highway North, Sebastopol, CA 95472, USA";
self.myGeocoder = [[CLGeocoder alloc] init];
[self.myGeocoder
geocodeAddressString: oreillyAddress
completionHandler: ^(NSArray *placemarks, NSError *error) {
if ([placemarks count] > 0 &&
error == nil){
NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
NSLog(@"Longitude = %f",
firstPlacemark.location.coordinate.longitude);
NSLog(@"Latitude = %f", firstPlacemark.location.coordinate.latitude);
}
else if ([placemarks count] == 0 &&
error == nil){
NSLog(@"Found no placemarks.");
}
else if (error!= nil){
NSLog(@"An error occurred = %@", error);
}
}];
}
Как только программа будет запущена (даже в симуляторе), в окне консоли появятся следующие значения (при наличии активного сетевого соединения):
Found 1 placemark(s).
Longitude = -122.8 41135
Latitude = 38.4 10373
См. также
Раздел 9.8.
9.8. Преобразование данных широты и долготы в обычные адреса
Постановка задачи
Имеются значения широты и долготы определенной точки в пространстве. Необходимо получить ее адрес.
Решение
Получение обычного адреса на основании известных пространственных координат (