Геокодирование данных расположения

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

Об объектах Geocoder

Объект geocoder использует сетевую службу для преобразования между широтой и значениями долготы и удобным для пользователя placemark, который является набором данных, таких как улица, город, состояние и информация о стране. Обратное геокодирование является процессом преобразования широты и долготы в placemark; прямое геокодирование является процессом преобразования информации о названии места в значения долготы и широту. Обратное геокодирование поддерживается во всех версиях iOS, но прямое геокодирование поддерживается только в iOS 5.0 и позже. Оба реверса и прямое геокодирование поддерживаются в OS X v10.8 и позже.

Поскольку geocoders полагаются на сетевую службу, соединение действующей сети должно присутствовать для запроса геокодирования для следования. Если устройство находится в Авиарежиме, или сеть в настоящее время не конфигурируется, geocoder не может соединиться со службой, в которой это нуждается и должно поэтому возвратить надлежащую ошибку. Вот некоторые эмпирические правила для создания запросов геокодирования:

Получение информации о Placemark Используя CLGeocoder

Подавать геокодирующую реверс заявку с помощью CLGeocoder класс, создайте экземпляр класса и вызовите reverseGeocodeLocation:completionHandler: метод. Объект geocoder подает обратную заявку геокодирования асинхронно и поставляет результаты к блочному объекту, который что Вы обеспечиваете. Блочный объект выполняется, успешно выполняется ли запрос или перестал работать. В случае отказа ошибочный объект передается блоку, указывающему причину отказа.

Перечисление 4-1 показывает пример того, как инвертировать, геокодируют точку на карте. Единственный код, определенный для запроса геокодирования, является первыми несколькими строками, выделяющими объект geocoder по мере необходимости и вызывающими reverseGeocodeLocation:completionHandler: метод для запуска геокодирующей реверс работы. ( geocoder переменная представляет задействованную переменную, используемую, чтобы хранить geocoder объект.) Остальная часть кода является определенной для самого демонстрационного приложения. В этом случае демонстрационное приложение хранит placemark пользовательским объектом пометок (определенный MapLocation класс), и добавляет кнопку к выноске соответствующего представления аннотации.

Перечисление 4-1  , Геокодирующее использование расположения CLGeocoder

@implementation MyGeocoderViewController (CustomGeocodingAdditions)
- (void)geocodeLocation:(CLLocation*)location forAnnotation:(MapLocation*)annotation
{
    if (!geocoder)
        geocoder = [[CLGeocoder alloc] init];
 
    [geocoder reverseGeocodeLocation:location completionHandler:
        ^(NSArray* placemarks, NSError* error){
            if ([placemarks count] > 0)
            {
                annotation.placemark = [placemarks objectAtIndex:0];
 
                // Add a More Info button to the annotation's view.
                MKPinAnnotationView* view = (MKPinAnnotationView*)[map viewForAnnotation:annotation];
                if (view && (view.rightCalloutAccessoryView == nil))
                {
                    view.canShowCallout = YES;
                    view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
                }
            }
    }];
}
@end

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

Преобразование названий места в координаты

Используйте CLGeocoder класс со словарем информации об Адресной книге или простой строки для инициирования геокодирующих форварда запросов. Нет никакого заданного формата для основанных на операция со строками запросов: Символы-разделители приветствуются, но не требуемые, и geocoder сервер обрабатывает строку как нечувствительную к регистру. Например, любая из следующих строк привела бы к результатам:

Чем больше информации, которую можно предоставить форварду geocoder, тем лучше результаты возвратились к Вам. Объект geocoder анализирует информацию, которую Вы даете ему и если он находит соответствие, возвращает некоторое число объектов placemark. Число возвращенных объектов placemark зависит значительно от специфики информации, которую Вы предоставляете. Поэтому обеспечивание улицы, города, области и информации о стране, намного более вероятно, возвратит единственный адрес, чем обеспечение только информация о городе и улица. Обработчик завершения блокирует Вас, передают geocoder, должен быть подготовлен обработать многократный placemarks, как показано ниже.

[geocoder geocodeAddressString:@"1 Infinite Loop"
     completionHandler:^(NSArray* placemarks, NSError* error){
         for (CLPlacemark* aPlacemark in placemarks)
         {
             // Process the placemark.
         }
}];