Обеспечение направлений

Используя поддержку Набора Карты основанных на карте направлений, может приложение:

В OS X v10.9 и iOS 7.0 и позже, Набор Карты включает MKDirections API, предоставляющий основанные на маршруте данные направлений от серверов Apple. Приложение может использовать MKDirections API для улучшения его маршрута или информации о направлениях путем добавления поэтапно обхода или направлений движения, оценок времени передвижения, альтернативных маршрутов и другой информации.

Для использования функций платформы Набора Карты необходимо включить возможность Карт в проекте XCode.

Выяснение, чтобы приложение карт вывело на экран направления

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

Для генерации запроса направления используйте openMapsWithItems:launchOptions: или openInMapsWithLaunchOptions: метод MKMapItem. Эти методы позволяют Вам отправить элементы карты в приложение Карт так, чтобы оно могло вывести на экран их. Если Вы включаете MKLaunchOptionsDirectionsModeKey ключ с опциями запуска, которые Вы передаете этим методам, Карты, выводит на экран направления между запуском и элементами карты конца, которые Вы обеспечиваете.

Перечисление 7-1 показывает метод, открывающий указанную область в приложении Карт и центрирующий карту на ее расположении. Вы используете launchOptions параметр openMapsWithItems:launchOptions: метод для указания области карты Вы хотите вывести на экран.

Перечисление 7-1  , Выводящее на экран расположение в приложении Карт

- (void)displayRegionCenteredOnMapItem:(MKMapItem*)from {
   CLLocation* fromLocation = from.placemark.location;
 
   // Create a region centered on the starting point with a 10km span
   MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(fromLocation.coordinate, 10000, 10000);
 
   // Open the item in Maps, specifying the map region to display.
   [MKMapItem openMapsWithItems:[NSArray arrayWithObject:from]
              launchOptions:[NSDictionary dictionaryWithObjectsAndKeys:
                  [NSValue valueWithMKCoordinate:region.center], MKLaunchOptionsMapCenterKey,
                  [NSValue valueWithMKCoordinateSpan:region.span], MKLaunchOptionsMapSpanKey, nil]];
}

Для получения информации о том, как открыть приложение Карт программно, посмотрите Ссылку класса MKMapItem.

Регистрация как приложение маршрутизации (только iOS)

Приложение, которое в состоянии вывести на экран направления точка-точка, может зарегистрироваться как приложение маршрутизации и сделать те направления доступными для приложения Карт и для всех других приложений на устройстве пользователя. При регистрации, поскольку приложение маршрутизации улучшает пользовательский опыт путем предоставления других приложений средние значения для доступа к маршрутной информации из приложения, таким образом предотвращения потребности в каждом приложении для обеспечения его собственных направлений маршрутизации. Это - также отличный способ получить Ваше приложение перед пользователем, потому что Карты выводят на экран надлежащие предложения от App Store как опции для отображения направлений.

Зарегистрировать Ваше приложение как провайдера направлений:

Конфигурирование приложения для принятия запросов направлений

Для включения поддержки направлений приложения сконфигурируйте следующую поддержку цели приложения в XCode:

  • Включите запросы маршрутизации и укажите типы направлений, Ваше приложение способно к обеспечению.

  • Сконфигурируйте специальный тип документа для обработки входящих запросов маршрутизации.

Подключение iTunes требует обоих элементов для всех приложений маршрутизации.

Вы включаете поддержку запроса маршрутизации путем выбора надлежащих флажков Маршрутизации в разделе Maps области Capabilities цели в XCode. (Для узнавания больше о процессе конфигурации см. “Конфигурирование Приложения маршрутизации iOS” в Руководстве по Распределению приложений.) Включение поддержки направлений добавляет MKDirectionsApplicationSupportedModes ключ к Вашему приложению Info.plist файл и наборы значение того ключа к режимам транспортировки Вы выбираете. Необходимо также обеспечить файл ДЖОДЖСОНА, содержащий области, для которых приложение способно к обеспечению направлений. (Для получения информации об указании файла ДЖОДЖСОНА посмотрите Объявление Поддерживаемого Географического охвата для Направлений.)

В дополнение к объявлению типов направлений Ваши поддержки приложений необходимо добавить к проекту тип документа, цель которого состоит в том, чтобы обработать входящие запросы маршрутизации. Для добавления типа документа используйте редактора типа документа XCode, расположенного на вкладке Info цели. Создайте новый тип и используйте информацию в Таблице 7-1 для установки значений для типа. Необходимо использовать значения в таблице точно, поскольку они появляются здесь.

Табличные 7-1  Ключи и значения для направлений запрашивают тип документа

Поле Xcode

Значение

Описание

Имя

MKDirectionsRequest

Значение в этом поле может быть чем-либо, что Вы хотите, но Вы призваны использовать предложенное значение.

Типы

com.apple.maps.directionsrequest

Значение этого ключа является пользовательским типом UTI, используемым для идентификации запросов направления. Значение этого ключа должно быть точно как показано здесь.

Изменения, которые Вы вносите в редакторе типов документов, заставляют XCode добавлять соответствующую запись в CFBundleDocumentTypes введите свое приложение Info.plist файл. Для получения дополнительной информации о Вашем приложении Info.plist файл и ключи, которые Вы помещаете в него, посмотрите информационную Ключевую Ссылку Списка свойств.

Объявление поддерживаемого географического охвата для направлений

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

Для объявления поддерживаемых областей приложения создайте файл ДЖОДЖСОНА, который является типом Объектной нотации JavaScript (JSON) файл. Это - файл географического охвата Вашего приложения, и он содержит ряд координат карты, определяющих границы одной или более географических областей. Формат этого файла является частью общедоступной спецификации, подробные данные которой можно получить в http://geojson .org/geojson-spec.html.

Ваш файл географического охвата используется приложением Карт и App Store, но не Вашим приложением. Загрузка его к Подключению iTunes позволяет Картам искать приложения на App Store, которые способны к обеспечению направлений в целевой области. Файл географического охвата может тогда предоставить пользователю ту информацию в случае, если пользователь хочет загрузить одно из тех приложений. Поскольку Вы загружаете файл географического охвата на Подключение iTunes, можно также обновить файл в любое время, не представляя новую версию приложения.

Указание содержания файла географического охвата

Файл географического охвата должен содержать сингл MultiPolygon форма, определяющая границы поддерживаемых географических областей. Единственный много многоугольник может содержать многократные дочерние многоугольники, каждый из которых определяет границы вокруг единственной географической области. Каждый дочерний многоугольник содержит четыре или больше координатных значения, определяющие границы многоугольника. На спецификацию ДЖОДЖСОНА каждый дочерний многоугольник должен представлять закрытую область — т.е. первые и последние координатные значения должны всегда быть идентичными. Поэтому необходимо указать по крайней мере четыре точки для определения треугольной области, которая является самой простой формой. Конечно, Вы используете больше точек для определения более сложных многоугольников.

Перечисление 7-2 показывает пример файла географического охвата, указывающего две отдельных области: один вокруг Сан-Франциско и один вокруг Чикаго. Обратите внимание на то, что координаты для каждой области окружаются тем, что, кажется, дополнительный набор скобок. В каждом случае первая открытая скобка отмечает начало полной формы многоугольника, вторая открытая скобка определяет начало внешнего многоугольника ограничения, и третья открытая скобка отмечает начало первой координаты.

Перечисление 7-2  выборка файл ДЖОДЖСОНА

{ "type": "MultiPolygon",
  "coordinates": [
    [[[-122.7, 37.3], [-121.9, 37.3], [-121.9, 37.9], [-122.7, 37.9], [-122.7, 37.3]]],
    [[[-87.9, 41.5], [-87.3, 41.5], [-87.3, 42.1], [-87.9, 42.1], [-87.9, 41.5]]]
    ]
}

Используйте следующие инструкции, чтобы помочь Вам определить области для своего приложения:

  • Определите максимально определенную область. Например, если Ваше приложение обеспечивает маршрутную информацию метро только для Нью-Йорка, Вы не хотите, чтобы он получил запросы для обеспечения направлений в Лондоне. Чем более определенный область, которую Вы определяете, тем более вероятно Ваше приложение появится в результатах поиска.

  • Сохраните свои области простыми и не пытайтесь проследить точные маршруты вокруг данной географической области. Рекомендуется, чтобы каждый многоугольник содержал не больше, чем 20 точек. Используя большее количество координат для определения области является возможным, но является неэффективным и обычно ненужным. Система должна определить, является ли данная точка внутренним из Ваших многоугольников, и более дешево сделать то определение против прямоугольника или другой простой формы, чем это против формы с сотнями точек.

  • Ограничьте число дочерних многоугольников в Вашем MultiPolygon сформируйте к 20 или меньше.

  • Используйте только MultiPolygon формы в файле покрытия Вашего приложения. Несмотря на то, что спецификация ДЖОДЖСОНА поддерживает другие типы форм, только MultiPolygon формы поддерживаются для приложений маршрутизации.

  • Не включайте комментарии в свой файл покрытия.

  • Укажите все координаты как значение долготы, сопровождаемое значением широты.

  • Не включайте дыры в многоугольники в Ваших файлах покрытия. Несмотря на то, что дыры поддерживаются спецификацией ДЖОДЖСОНА, они не поддерживаются в реализации карт Apple.

Загрузка Файла ДЖОДЖСОНА к Подключению iTunes

При загрузке приложения на Подключение iTunes сервер проверяет приложение Info.plist файл для присутствия MKDirectionsApplicationSupportedModes ключ. Если тот ключ присутствует, страница Connect iTunes для Вашего приложения включает пространство для загрузки Вашего файла географического охвата. Необходимо загрузить файл, прежде чем сможет быть утверждено приложение. Посмотрите Значки Загрузки, Снимки экрана и Файлы Приложения маршрутизации для Вашего Приложения в Руководстве разработчика Подключения iTunes для получения дополнительной информации.

Отладка файла географического охвата приложения

Это - хорошая идея протестировать Ваш файл ДЖОДЖСОНА прежде, чем загрузить его на Подключение iTunes. Во время разработки используйте опции схемы своего проекта XCode указать файл географического охвата для тестирования. При выполнении приложения в средстве моделирования XCode передает этот файл средству моделирования или устройству так, чтобы приложение Карт знало об областях поддержки приложений.

Указать файл географического охвата для тестирования:

  1. Откройте редактора схемы для своего проекта.

  2. Выберите схему Run (Debug) своего проекта.

  3. На вкладке Options выберите свой файл покрытия из всплывающего меню Routing App Coverage File.

Редактор схемы должен казаться, подобным рисунку 7-1.

Рисунок 7-1  Выбор файл GeoJSON в редакторе схемы

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

Обрабатывание запросов направлений URL

Система отправляет запросы направлений к маршрутизации или другому приложению с помощью URLs. Например, когда пользователь просит у приложения Карт направления и выбирает Ваше приложение, Карты создает URL с запуском и конечными точками и просит, чтобы Ваше приложение открыло его. Вы обрабатываете открытие этого URL в Вашем приложении application:openURL:sourceApplication:annotation: метод, точно так же, как Вы были бы для другого URLs. Но шаги, которые Вы предпринимаете для обработки URL, немного более предписаны.

Когда Ваше приложение получит URL для открытия, выполните следующие шаги в application:openURL:sourceApplication:annotation: метод:

  1. Вызовите isDirectionsRequestURL: метод класса MKDirectionsRequest проверять, содержит ли URL запрос направлений. Если URL содержит запрос направлений, продолжите с остающимися шагами.

  2. Создайте MKDirectionsRequest объект с помощью предоставленного URL.

  3. Получите запуск и конечные точки маршрута от MKDirectionsRequest объект.

    Запуск и конечные точки указаны как MKMapItem объекты, содержащие географическую координату расположения и возможно дополнительной информации. Если MKMapItem объект представляет текущее расположение пользователя, используйте Базовое Расположение для получения фактических координатных данных расположения сами.

  4. Вычислите и выведите на экран маршрут с помощью пользовательской логики.

Поскольку предыдущие шаги являются тем же для каждого приложения, можно включать код в Ваш application:openURL:sourceApplication:annotation: метод, подобный показанному в Перечислении 7-3. Самое важное дополнение, которое необходимо сделать, должно вычислить маршрутную информацию и вывести на экран ее в приложении. Если бы Ваше приложение обрабатывает другие типы URL, Вы также включали бы код для обработки того URLs отдельно.

Перечисление 7-3  , Обрабатывающее запрос направлений URL

- (BOOL)application:(UIApplication *)application
           openURL:(NSURL *)url
           sourceApplication:(NSString *)sourceApplication
           annotation:(id)annotation {
   if ([MKDirectionsRequest isDirectionsRequestURL:url]) {
      MKDirectionsRequest* directionsInfo = [[MKDirectionsRequest alloc] initWithContentsOfURL:url];
      // TO DO: Plot and display the route using the
      //   source and destination properties of directionsInfo.
      return YES;
   }
   else {
    // Handle other URL types...
   }
    return NO;
}

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

Получение информации направлений общего назначения

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

Получить информацию направлений общего назначения:

  1. Создайте MKDirectionsRequest возразите и сконфигурируйте его с MKMapItem объекты, представляющие запуск и конечные точки маршрута. Если необходимо указать, что тип транспортировки, такой как обход или управление, установил объект запроса transportType свойство.

  2. Создайте MKDirections возразите и инициализируйте, это с запросом возражает, что Вы создали на шаге 1.

  3. Запустите находящий маршрут процесс путем вызова calculateDirectionsWithCompletionHandler: и обеспечение блока, обрабатывающего результаты.

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

Перечисление 7-4 показывает один способ создать запрос направлений, вычислить одиночный маршрут и обработать результаты.

Перечисление 7-4  , Запрашивающее направления

MKDirectionsRequest *walkingRouteRequest = [[MKDirectionsRequest alloc] init];
walkingRouteRequest.transportType = MKDirectionsTransportTypeWalking;
[walkingRouteRequest setSource:[startPoint mapItem]];
[walkingRouteRequest setDestination :[endPoint mapItem]];
 
MKDirections *walkingRouteDirections = [[MKDirections alloc] initWithRequest:walkingRouteRequest];
[walkingRouteDirections calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * walkingRouteResponse, NSError *walkingRouteError) {
   if (walkingRouteError) {
      [self handleDirectionsError:walkingRouteError];
   } else {
      // The code doesn't request alternate routes, so add the single calculated route to
      // a previously declared MKRoute property called walkingRoute.
      self.walkingRoute = walkingRouteResponse.routes[0];
   }
}];

Объект маршрута определяет геометрию для одного маршрута и включает объект ломаной линии, что можно использовать в качестве наложения для показа маршрута на карте. Если Вы запросили альтернативные маршруты, объект ответа, передающийся Вашему обработчику завершения, может содержать многократные объекты маршрута в routes массив. Перечисление 7-5 показывает один способ выполнить итерации по массиву маршрутов и вывести на экран ломаную линию, связанную с каждым альтернативным маршрутом.

Перечисление 7-5  , Выводящее на экран альтернативные маршруты

- (void) myShowDirections:(MKDirectionsResponse *)response {
   self.response = response;
   for (MKRoute *route in self.response.routes) {
      [self.mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
   }
}