Разработка приложений, учитывающих географическое положение, с использованием функций геолокации и карт Bing Maps

Если в бизнес-логике вашего приложения учитывается местоположение пользователя, вы можете предоставлять пользователям приложения актуальный прогноз погоды, рассылать купоны, информацию о спортивных мероприятиях или концертах. Вы можете использовать геолокационные возможности Windows 8, а также пакет Bing Maps SDK для разработки приложений для Магазина Windows, учитывающих географическое положение.

Сейчас я расскажу вам, как ваше приложение может воспользоваться возможностями службы расположения для предоставления пользователям информации с учетом их местоположения, которое определяется по IP-адресу, параметрам сети Wi-Fi или данным GPS. После определения местоположения вы можете предоставить эту информацию пользователю с помощью Bing Maps SDK.

Получение сведений о расположении

Пространство имен Windows.Devices.Geolocation используется для получения сведений о вашем местоположении. На выбор метода определения местоположения пользователя (GPS, Wi-Fi или IP-адрес) влияют два основных фактора:

  1. Уровень требуемой точности. Оптимальный уровень точности для вашего приложения.
  2. Доступность данных о местоположении. Не во все устройства встроен модуль GPS, кроме того, сеть Wi-Fi может быть недоступна, когда запрашиваются сведения о местоположении.

Требуемая точность

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

  • GPS — модуль GPS обеспечивает максимальную точность, погрешность обычно составляет не более 10 метров. Однако если модуль GPS необходимо «разбудить», чтобы получить данные со спутников и провести их триангуляцию, то приложение выдаст сведения о расположении не ранее, чем через 1–2 минуты. Как только модуль GPS установит связь со спутниками, он будет быстрее определять местоположение. Разумеется, чем дольше GPS используется, тем больше энергии потребляет. Чтобы получить данные от модуля GPS, необходимо свойству Geolocator.DesiredAccuracy задать значение High.
  • Wi-Fi — соединение Wi-Fi позволяет определять местоположение с точностью до 300–500 метров. При наличии подключения по Wi-Fi, данные о местоположении можно получить быстрее, чем при использовании модуля GPS, которому сначала требуется установить связь со спутниками. Установите для свойства DesiredAccuracy значение Default, если хотите получать сведения о расположении с учетом параметров соединения Wi-Fi.
  • IP — IP-адрес позволяет определять местоположение с точностью до 1 км. При наличии сетевого подключения данные о местоположении можно получить быстрее, чем при использовании модуля GPS, которому сначала требуется установить связь со спутниками. Установите также для свойства DesiredAccuracy значение Default, если хотите получать сведения о расположении с учетом IP-адреса. Служба расположений старается вычислить местоположение максимально точно; достигнутая точность указывается в свойстве Geocoordinate.Accuracy.

К вопросу определения требуемой точности следует подходить со всей тщательностью. От этого зависит производительность вашего приложения и энергопотребление устройства. Например, если ваше приложение рассылает пользователям прогноз погоды, вам обычно не нужна точность на уровне GPS. Также не забудьте указать точность своих данных с помощью радиуса ошибки, рассчитанного с учетом точности возвращаемых данных. Код C# для задания требуемой точности:

C#

 Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.High;
 

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

C#

 Geoposition pos = await geolocator.GetGeopositionAsync().AsTask(token);

Следующий код JavaScript который создает экземпляр класса Geolocator, задает требуемую точность, а затем получает сведения о текущем местоположении. Обратите внимание на то, что переменная promise представляет собой объект WinJS.Promise, вам понадобиться метод done для получения данных с использованием вызова getGeopositionAsync.

JavaScript

  var geolocator = Windows.Devices.Geolocation.Geolocator();
 geolocator.desiredAccuracy =
 Windows.Devices.Geolocation.PositionAccuracy.high;
 
 // Get the geoposition, capturing the request in a 'promise' object.
 var promise = geolocator.getGeopositionAsync();

 

Не забывайте о том, что когда вы задаете желаемую точность на уровне High, вы не можете быть уверены в том, что устройство пользователя сможет такую точность обеспечить. На ПК может отсутствовать модуль GPS или он может быть отключен, устройство может быть не подключено к сети Wi-Fi и т. д. Вы всегда должны быть готовы корректно обработать данные с низкой точностью. Как именно вы будете это делать, зависит от функциональных возможностей вашего приложения. Достаточно ли полученные данные точны, чтобы приложение могло продолжить свою работу? Можете ли вы запросить данные с точностью на уровне GPS? Для получения дополнительной информации см. Guidelines for location-aware apps.

Приложение Bing Maps

Bing Maps — хороший пример приложения, которое адаптируется к точности полученных данных о местоположении. На настольном ПК, который обычно не оборудован модулем GPS или Wi-Fi, оно определяет местоположение с учетом IP-адреса, при этом на экран выводится регион, в котором находится пользователь. На ноутбуке со встроенным модулем беспроводной связи приложение использует Wi-Fi, чтобы получить более точные сведения о местоположении и вывести на экран более детализированную информацию. Если пользователь хочет получить еще более точные сведения, то система отображает радиус ошибки. На устройствах, оборудованных модулем GPS, приложение Bing Maps получает максимально точные данные и выводит на экран соответствующие сведения о местоположении.

Приложение Bing Weather

Как уже упоминалось, приложениям, подобным Bing Weather, достаточно данных о регионе. Поэтому в приложении можно указать, что ему подходят данные с низкой точностью, и быстро получить сведения о местоположении. С точки зрения пользователя, быстродействие приложения повышается. Другие примеры приложений, которым, возможно, потребуются только данные о регионе: инструменты поиска радиостанций, сервисы рассылки информации о предложениях местных магазинов или местные новостные каналы.

Отображение сведений о местоположении с помощью Bing Maps SDK

Получив сведения о местоположении с помощью вызова GetGeopositionAsync, вы можете отобразить эту точку на карте.

  • Для начала Geoposition необходимо преобразовать в Location, чтобы приложение Bing Maps могло работать с этой информацией. Сделать это позволяет следующий код:

C#

 Location location = new Location(pos.Coordinate.Latitude, pos.Coordinate.Longitude);

JavaScript:

 promise.done(
 function (pos) {
 // Get the coordinates of the current location.
 var coord = pos.coordinate,
 location = new Microsoft.Maps.Location(coord.latitude, coord.longitude);
 
 },
 function (err) {
 // Handle the error.
 });

 

    • Затем местоположение выводится на экран в приложении Bing Maps. Пакет Bing Maps SDK можно загрузить отсюда. Вам также понадобится ключ для Bing Maps. Чтобы его получить, зарегистрируйтесь на портале Bing Maps и следуйте инструкциям: Getting a Bing Maps Key. В процессе регистрации ознакомьтесь с ограничениями для ключа каждого типа и выберите подходящий ключ для своего приложения. 
      Добавьте элемент управления Bing Maps в свой конструктор и укажите ключ в учетных данных.

 

 <Page
 xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="using:SimpleMapping"
 xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:Maps="using:Bing.Maps"
 x:Class="SimpleMapping.MainPage"
 mc:Ignorable="d">
 
 <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
 <Maps:Map x:Name="Map" Margin="0,120,0,0" Credentials="Insert Your Bing Maps Key Here"/>
 </Grid>
 </Page>
    • Следующий фрагмент вы можете включить в код страницы в своем приложении, где отображается карта. Здесь настраивается масштаб карты и отображается местоположение. Подробнее о масштабе описано в статье How to display your location on a Bing Map.

 

C#

 double zoomLevel = 13.0f;
 
Map.SetView(location, zoomLevel);

Добавить элемент управления Bing Maps в ваше приложение с использованием JavaScript и HTML немного сложнее. Добавьте следующий тег <script> в код HTML своего приложения:

 

 <script type="text/javascript" 
 src="ms-appx:///Bing.Maps.JavaScript//js/veapicore.js">
 /script>

Затем нужно создать тег <div> с картой и задать атрибут ID, чтобы вы могли получить к нему доступ.

 <div id=’map-div’></div>

Наконец, вы должны инициализировать элемент управления карты для своей HTML-страницы. Для этого используется следующий код JavaScript:

 // Load the Microsoft.Maps.Map module and then call getMap when the 
 // module has loaded.
 function initMap() {
 Microsoft.Maps.loadModule('Microsoft.Maps.Map', 
 { 
 callback: getMap, 
 culture: "en", 
 homeRegion: "US" 
 });
 }
 
 // Get the div to contain the map from the interface of the app.
 function getMap() {
 
 // Create a new instance of the Map class, passing in the app ID.
 var map = new Microsoft.Maps.Map(
 document.getElementById(mapDivId), 
 { credentials: “Insert your credentials here” });
 
 // Set the initial zoom level and type of map.
 map.setView({
 mapTypeId: Microsoft.Maps.MapTypeId.road,
 zoom: 3
 });
 }
  • Кроме того, любое приложение, использующее сведения о расположении, должно учитывать установленные пользователем разрешения, которые могут измениться в любой момент. Приложение Weather использует данные о местоположении, чтобы вывести на экран актуальный прогноз погоды. Но пользователь всегда может зайти в настройки и отключить функцию определения местоположения, и ваше приложение должно учитывать такую возможность. В этом случае приложение Weather должно вывести на экран соответствующее предупреждение, например: «Ваше местоположение не может быть определено. Необходимо разрешить приложению Weather определять ваше местоположение». Рекомендации по поводу работы с пользовательскими настройками при определении местоположения см. в документе Guidelines for location-aware apps (Руководство по разработке приложений, учитывающих географическое положение).  

Bing Weather app using location to get weather for the current location

 

Функции определения географического положения и использования Bing Maps SDK подробнее рассматриваются в видео, руководствах и примере кода. Там вы найдете пошаговые инструкции для асинхронного получения сведений о расположении с последующей визуализацией этой информации с помощью Bing Maps SDK. Вы узнаете, как активировать функцию определения местоположения, асинхронно получить соответствующие сведения, вывести требуемый участок карты и настроить значок местоположения с учетом точности полученных данных. Дополнительная информация также представлена на странице Bing Maps for Windows Store Apps (Bing Maps и приложения для Магазина Windows).

Упаковка

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

Автор: Росс Хейзе (Ross Heise), старший разработчик контента, Windows Developer Content

Выражаю особую благодарность Джону Кею (Jon Kay) и Эрику Шмидту (Eric Schmidt) за помощь в подготовке этой статьи.