Объект делегата, относящийся к классу MKMapView, должен соответствовать протоколу MKMapViewDelegate и реализовывать метод mapView: viewForAnnotation:. Возвращаемое значение этого метода является экземпляром класса MKAnnotationView. Любой объект, являющийся подклассом вышеупомянутого класса, по умолчанию наследует свойство image. Если присвоить этому свойству такое значение, то мы заменим стандартное значение, предоставляемое во фреймворке Map Kit. Результат показан на рис. 9.4.

Рис. 9.4. Наше собственное изображение, показанное в картографическом виде

<p>См. также</p>

Раздел 9.5.

<p>9.7. Преобразование обычных адресов в данные широты и долготы</p><p>Постановка задачи</p>

Имеется адрес определенного места, необходимо найти его географические координаты (широту и долготу).

<p>Решение</p>

Воспользуйтесь методом geocodeAddressString: completionHandler: из класса CLGeocoder.

<p>Обсуждение</p>

Обратное геокодирование (Reverse Geocoding) — это процесс получения обычного адреса (то есть страны, города и т. д.) на базе известного пространственного расположения (координат широты и долготы). В свою очередь, геокодирование — это процесс нахождения пространственного расположения в сетке координат на основе известного адреса. Функции геокодирования и обратного геокодирования заключены в классе CLGeocoder фреймворка Core Location.

Пространственное местоположение геокодируется путем передачи адреса в формате 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

<p>См. также</p>

Раздел 9.8.

<p>9.8. Преобразование данных широты и долготы в обычные адреса</p><p>Постановка задачи</p>

Имеются значения широты и долготы определенной точки в пространстве. Необходимо получить ее адрес.

<p>Решение</p>

Получение обычного адреса на основании известных пространственных координат (x и y) называется обратным геокодированием. Для выполнения такой операции нужно создать и использовать экземпляр класса CLGeocoder, а также предоставить блоковый объект завершения. При этом необходимо гарантировать, что блоковый объект не имеет возвращаемого значения и принимает два параметра:

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Похожие книги