API и элементы управления для работы с картами в платформе универсальных приложений Windows: сервисы местоположения

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


В первой публикации из серии об API и элементах управления для работы с картами в платформе универсальных приложений Windows вы узнали как приступить к работе с элементом управления Map Control. В этой второй публикации мы погрузимся немного глубже и узнаем как:
— Использовать геолокацию, геокодирование и обратное геокодирование
— Проложить маршрут между двумя точками
— Показать направление маршрута
— Использовать карты в автономном режиме (офлайн)
— Как использовать средство запуска карт Windows Map

Картография 101
Давайте начнем с освежения в памяти о геопозиционировании. Местоположение на Земле может быть определено его координатами: широтой и долготой. Линии широты (выделены оранжевым цветом на иллюстрации ниже) идут параллельно экватору (обозначен красным) и имеют возрастающие положительные значения выше экватора, заканчивающийся 90 градусами, а отрицательные значения ниже, заканчивающиеся -90 градусами. Линии долготы (зеленый цвет) простираются от Северного полюса до Южного полюса. Нулевой меридиан (обозначен синим цветом) имеет значение, равное нулю, а все остальные линии долготы имеют значение в диапазоне от нуля до 180 градусов по отношению к нему.
Геопозиционирование иногда включают в себя информацию об абсолютной высоте. Высота геопозиции часто измеряется как расстояние над уровнем моря, но также может быть измерено другими способами в зависимости от системы высоты, которую вы используете.


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


Сделав это, вы сможете использовать класс Geolocator для запроса информации о текущем геоположении устройства:

  1. var status = await Geolocator.RequestAccessAsync();
  2. if (status == GeolocationAccessStatus.Allowed)
  3. {
  4.     var locator = new Geolocator();
  5.     var position = await locator.GetGeopositionAsync();
  6.     var lat = position.Coordinate.Latitude;
  7.     var lon = position.Coordinate.Longitude;
  8. }

Геокодирование, напротив, предполагает извлечение геопозиции из физического адреса или названия места. Например, вы хотите чтобы найти местоположение адреса такого персонажа как Шерлок Холмс. По рассказам Артура Конан Дойла Шерлок Холмс жил по адресу 221B, Бейкер стрит в Лондоне. Вы можете использовать MapLocationFinder класс для выполнения поиска.

  1. var address = «221B Baker Street, London, England»;
  2. var results = await MapLocationFinder.FindLocationsAsync(address, null);
  3. if (results.Status == MapLocationFinderStatus.Success)
  4. {
  5.     var lat = results.Locations[0].Point.Position.Latitude;
  6.     var lon = results.Locations[0].Point.Position.Longitude;
  7. }

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

  1. this.myMap.Center = new Geopoint(new BasicGeoposition()
  2. {
  3.     Latitude = lat,
  4.     Longitude = lon
  5. });

Обратное геокодирование это процесс получения физического адреса, имея координаты геопозиции. Оно работает точно так же, как и прямое геокодированию за исключением того, что вы вызываете FindLocationsAtAsync, а не FindLocationsAsync. Например, давайте посмотрим, что произойдет если мы проделаем это с геоточкой ниже:

  1. Geopoint geoPosition = new Geopoint(new BasicGeoposition()
  2. {
  3.     Latitude = 51.502265,
  4.     Longitude = 0.190998
  5. });
  6. var result = await MapLocationFinder.FindLocationsAtAsync(geoPosition);
  7. if (result.Status == MapLocationFinderStatus.Success)
  8. {
  9.     var address = result.Locations[0].Address.FormattedAddress;
  10. }

Ваш результат «13 Kensington Church Street London W8 4 United Kingdom» — адрес, по которому примерно находилась медицинская практика, принадлежащая другу и соратнику Шерлока Холмса доктору Ватсону.

Как проложить маршрут из точки A в точку B
Теперь, когда вы являетесь мастером геолокации, геокодирования и обратного геокодирования, вы, вероятно, захотите иметь возможность проложить маршрут между двумя различными геопозициями. Например, вы хотите помочь Шерлоку Холмсу дойти от своей квартиры до офиса Ватсона на обед.
Для этого вам нужно просто указать начальную и конечную координаты экземпляру класса MapRouteFinder. Вы можете получить пешеходный или автомобильный маршрут. В этом случае пешеходный маршрут представляется более целесообразным. Вы сможете извлечь маршрут из построителя маршрута и использовать его для отображения на карте с помощью класса MapRouteView. Затем добавляете MapRouteView на элемент управления Map и красивый маршрут отрисовывается на карте для вас.

  1. //221B Baker St
  2. Geopoint holmes = new Geopoint(new BasicGeoposition()
  3. {
  4.     Latitude = 51.523304,
  5.     Longitude = 0.158087
  6. });
  7. //Church St
  8. Geopoint watson = new Geopoint(new BasicGeoposition()
  9. {
  10.     Latitude = 51.502265,
  11.     Longitude = 0.190998
  12. });
  13. //find route
  14. var result = await MapRouteFinder.GetWalkingRouteAsync(holmes, watson);
  15. if (result.Status == MapRouteFinderStatus.Success)
  16. {
  17.     //put route in a map route view object
  18.     var routeView = new MapRouteView(result.Route);
  19.     //add route view object to map control
  20.     this.myMap.Routes.Add(routeView);
  21. }

Цвет маршрута по умолчанию является синим, но вы можете самостоятельно выбрать цвет заливки и контура, установив свойства MapRouteView.RouteColor и MapRouteView.OutlineColor.

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

  1. //create a new string builder
  2. var sb = new StringBuilder();
  3. //write out detailed directions
  4. foreach (var leg in result.Route.Legs)
  5. {
  6.     foreach (var maneuver in leg.Maneuvers)
  7.     {
  8.         sb.AppendLine(maneuver.InstructionText);
  9.     }
  10. }

В этом случае объект построителя строки содержит текст с инструкцией на английском для приятной прогулки длительностью 1 час и 3 минуты по Лондону через Гайд-парк.

  1. Head south on Baker Street.
  2. Turn right onto Marylebone Road.
  3. Turn left onto Old Marylebone Road.
  4. Turn right.
  5. Turn left onto Lancaster Terrace.
  6. Turn left onto Bayswater Road.
  7. Turn right.
  8. Turn right onto North Walk.
  9. Turn left onto Budges Walk.
  10. Turn slightly right.
  11. Turn left.
  12. Turn slightly right.
  13. Turn slightly right.
  14. Turn left onto Kensington Palace Green.
  15. Turn right.
  16. Turn slightly left onto Lancer Square.
  17. Turn right onto Old Court Place.
  18. Turn left onto Kensington Church Street.
  19. You have reached your destination.

Используйте карты, даже если вы находитесь в автономном режиме (офлайн)
Доступ в Интернет не всегда доступен. Было бы печально, если это отсутствие доступа автоматически отключало ваше UWP картографическое приложение. К счастью, Windows 10 Desktop предлагает новую функцию (ранее она была доступна только для телефонов), которая позволяет загрузить карты. После того, как они загружены, пользователи могут воспользоваться офлайн картами, когда нет интернет-подключения.
Пользователи могут настроить свои автономные карты в Windows 10, перейдя к Параметрам системы.

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

Запускатель карт Windows
В то время как элемент управления UWP Map Control предоставляет вам удивительное количество возможностей контроля над тем, как вы предоставляете карты, на самом деле вы не обязаны использовать всю эту мощь, если вы не хотите её использовать. Вместо этого вы можете использовать приложение Windows Maps, которое основано на шаблонах URI вызовов для отображения карт. Обратите внимание, что URI для Windows Maps всегда должны начинаться с «bingmaps» и двоеточия.

  1. var uri = new Uri(@»bingmaps:»);
  2. await Launcher.LaunchUriAsync(uri);

Это запускает самую простую карту без каких-либо спецификаций.

Для того, чтобы реально воспользоваться приложением Windows Maps, необходимо сформировать строку запроса для базового URI и добавить пары имя-значение. Приведенные ниже примеры демонстрируют отображение мировых координат, установку уровня масштабирования и поиска адреса 221B Бейкер-стрит.

  1. Bingmaps😕cp=51.505695~0.135996
  2. Bingmaps😕lvl=12
  3. Bingmaps😕where=221B%20Baker%20Street%20London%20England

Вы можете узнать больше о синтаксисе URI приложения Windows Maps на сайте MSDN.

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

Перевод оригинальной публикации Map APIs and controls: Location services
Перевод: Сергей Урусов

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *