Создание приложений, учитывающих местоположение пользователя, с помощью пространства имен geolocation и приложения "Карты Bing

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

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

Получение информации о расположении

Для получения информации о расположении используется пространство имен Windows.Devices.Geolocation. Что именно используется для определения расположения пользователя — GPS, сеть Wi-Fi или IP-адрес, зависит от двух основных факторов:

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

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

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

  • GPS — GPS обеспечивает наибольшую точность с погрешностью около 10 метров. Однако когда датчик GPS включается после длительного периода неактивности, ему требуется получить данные со спутника и затем триангулировать их, поэтому получение данных о расположении может занимать одну или две минуты. После установки соединения со спутниками GPS может получать данные о новом расположении гораздо быстрее. Конечно, чем дольше вы используете GPS, тем больше энергии на это расходуется. Чтобы разрешить системе GPS получать данные, следует установить для свойства Geolocator.DesiredAccuracy значение High.
  • Wi-Fi — подключение по Wi-Fi обеспечивает уровень точности с погрешностью от 300 до 500 метров. Если подключение уже установлено, данные о расположении можно получить быстрее, чем система GPS установит соединение со спутниками. Установите для свойства DesiredAccuracy значение Default, чтобы получить данные о расположении с помощью подключения по Wi-Fi.
  • IP — уровень точности при использовании IP-адреса может иметь погрешность до 1 километра. При наличии установленного подключения к сети данные о расположении можно получить быстрее, чем система GPS установит соединение со спутниками. Чтобы получить данные о расположении по IP-адресу, следует также установить значение Default для свойства DesiredAccuracy. Служба определения местоположения возвращает данные о расположении с максимально доступной точностью и указывает соответствующий уровень точности с помощью свойства 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, поэтому для доступа к данным из вызова getGeopositionAsync вам потребуется использовать метод done.

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? Подробнее эти вопросы рассматриваются в руководстве для приложений, использующих данные о местоположении.

Карты Bing

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

Погода Bing

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

Отображение данных о расположении с помощью пакета SDK для приложения "Карты Bing"

После получения информации о расположении из вызова GetGeopositionAsync вам потребуется отобразить ее на карте.

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

 

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". Пакет SDK для приложения "Карты Bing" можно получить здесь. Вам также потребуется получить ключ "Карты Bing", зарегистрировавшись на портале "Карты Bing" и выполнив инструкции по получению ключа "Карты Bing". Во время регистрации обязательно ознакомьтесь с ограничениями на использование каждого из типов ключей и выберите тот тип, который оптимально подходит для вашего приложения.

    Добавьте элемент управления "Карты Bing" в свой конструктор и вставьте ключ в учетные данные.

 <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>
  • Теперь вы можете использовать следующий код на странице приложения, где отображается карта. Он задает уровень масштабирования карты и отображает расположение. Подробнее об уровне масштабирования рассказано в статье Отображение местоположения на карте Bing:

C#

 double zoomLevel = 13.0f;

Map.SetView(location, zoomLevel);

Чтобы добавить элемент управления "Карты Bing" в приложение на 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>

Затем необходимо инициализировать элемент управления map на 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
  });
}
  • Наконец, любое приложение, использующее данные о расположении, должно соблюдать установленные параметры разрешений, которые пользователь может изменить в любой момент. Приложение "Погода" использует данные о расположении, чтобы получить прогноз погоды для данной местности. Однако пользователь может в любой момент перейти к параметрам и отключить разрешения на определение расположения. Ваше приложение всегда должно учитывать такую возможность. Например, в такой ситуации приложение "Погода" отображает сообщение о том, что местоположение не может быть определено и вам необходимо изменить разрешения, чтобы приложение могло воспользоваться данными о расположении. Примеры обработки разрешений на определение расположения приведены в рекомендациях по взаимодействию с пользователем в руководстве для приложений, использующих данные о местоположении.

    Приложение "Погода Bing" использует данные о расположении для получения прогноза погоды для текущего местоположения

 

Подробное описание использования пространства имен geolocation и пакета SDK для приложения "Карты Bing" приведено в новых материалах — видеоролике, практических инструкциях и примере кода, где рассматриваются этапы асинхронного получения данных о расположении и использование пакета SDK для приложения "Карты Bing" для визуального представления текущего местоположения. Из этих материалов вы узнаете о том, как включить возможность определения расположения, как асинхронно получать данные о расположении, отображать заданное местоположение на карте и изменять значок расположения в зависимости от точности получаемых данных. Дополнительную информацию можно найти в статье, посвященной использованию карт Bing в приложениях Магазина Windows (возможно, на английском языке).

Заключение

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

– Росс Хейзе (Ross Heise), старший разработчик контента, отдел контента для разработчиков для Windows

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