Статьи

31 день Windows 8 | День № 14 Геолокация

Эта статья посвящена Дню № 14 из 31-й серии Windows 8 . Каждая из статей этой серии будет опубликована как для HTML5 / JS, так и для XAML / C # . Вы можете найти дополнительные ресурсы, загрузки и исходный код на нашем сайте .

advertisementsample4

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

Линия бизнес-приложений

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

Игры

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

Карты

Duh. Мы сделаем это как часть примера кода сегодня.

Путешествовать

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

Упражнение

Есть множество приложений для отслеживания маршрута тренировки. Думайте, бегаете, ездите на велосипеде и т. Д. Очевидное применение геолокации к этим приложениям — это возможность отобразить маршрут, который вы выбрали во время путешествий. Однако более важным, и я думаю, что эта ответственность, вероятно, ложится на самих производителей мобильных ОС, является способность распознавать аварии. В среднем 4500 велосипедистов в год становятся жертвами наездовгде они остаются травмированными (или хуже) на обочине дороги. В современном мире почти у каждого есть свой телефон, даже когда он бежит или катается на велосипеде. Представьте, что ваш телефон способен распознавать сильные удары (с использованием данных акселерометра или гироскопа), после которых вообще не происходит никаких движений. После 30 секунд бездействия ваш телефон предложит вам позвонить 911 и отправить текстовые сообщения в предварительно выбранный список контактов с сообщением SOS и вашим местоположением. Еще через 30 секунд он немедленно отправляет эту информацию и набирает 911. Эта функция может спасти жизни, так как многие из этих велосипедистов погибают без нужды только потому, что никто не знает, где они находятся. Извините за то, что так болезненно, но это важная вещь, чтобы думать.

Как видите, всегда есть способ получить данные о местоположении и сделать ваше приложение еще лучше. Кроме того, если вам нравятся мои идеи выше, вы можете их украсть. Скорее всего, я никогда не буду создавать какие-либо из этих приложений Для этого должно быть 48 часов в день.

Обновление нашего манифеста

К счастью, получить наши данные о геолокации довольно легко, и, как обычно, мы должны объявить, что Location — это одна из наших возможностей, чтобы использовать их. Для этого откройте раздел «Возможности» вашего файла package.appxmanifest и установите флажок «Расположение».

14-XAML-манифест

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

Получение наших данных геолокации

В этом примере я создал приложение, которое постоянно отслеживает местоположение устройства. Первое, что меня смутило в этом процессе, это то, как попросить пользователя разрешить отслеживать его местоположение в приложении. Если вы помните, в приложении « День блокировки экрана № 11» нам приходилось явно запрашивать у пользователя разрешение на доступ к экрану блокировки. С Location, однако, мы этого не делаем. Простой способ доступа к данным подскажет пользователю от вашего имени. Чтобы сделать это невероятно простым, вот ВСЕ код, который вам понадобится для доступа к местоположению устройства из вашего приложения. (Имейте в виду, что я отправляю все свои значения в TextBlocks на моем MainPage.xaml, которые отображают данные. Все они названы как [Datatype] Value, чтобы сделать это очевидным.)

Geolocator location;

protected override void OnNavigatedTo(NavigationEventArgs e)

{

    location = new Geolocator();

    location.PositionChanged += location_PositionChanged;

    location.StatusChanged += location_StatusChanged;

}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)

{

    location.PositionChanged -= location_PositionChanged;

    location.StatusChanged -= location_StatusChanged;

}

async void location_PositionChanged(Geolocator sender, PositionChangedEventArgs args)

{

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

    {

        Geoposition position = args.Position;

        LatitudeValue.Text = position.Coordinate.Latitude.ToString();

        LongitudeValue.Text = position.Coordinate.Longitude.ToString();

        AccuracyValue.Text = position.Coordinate.Accuracy.ToString();

        TimestampValue.Text = position.Coordinate.Timestamp.ToString();

        if (position.Coordinate.Altitude != null)

            AltitudeValue.Text = position.Coordinate.Altitude.ToString()

                                    + "(+- " + position.Coordinate.AltitudeAccuracy.ToString() + ")";

        if (position.Coordinate.Heading != null)

            HeadingValue.Text = position.Coordinate.Heading.ToString();

        if (position.Coordinate.Speed != null)

            SpeedValue.Text = position.Coordinate.Speed.ToString();

    });

}

async void location_StatusChanged(Geolocator sender, StatusChangedEventArgs args)

{

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

    {

        StatusValue.Text = args.Status.ToString();

    });

}

Как вы уже догадались, это операция, управляемая событиями. Когда моя страница загружается, я создаю новый объект Geolocator и добавляю два события: PositionChanged и StatusChanged.

PositionChanged является важным. Здесь мы получаем все полезные данные, такие как долгота, широта и точность. Все эти значения получены из класса Geocoordinate , и, как видно из приведенного выше кода, есть еще несколько.

  • Точность — это измерение в метрах радиуса круга, в котором нашей широтой и долготой являются центральные точки. Как это:

14-XAML-точность

  • Отметка времени — это фактическое время, когда было прочитано значение Location. Это включает в себя информацию о часовом поясе, поэтому вам придется конвертировать время, чтобы хранить все в UTC.
  • Высота — это высота устройства в метрах. Вероятно, это можно найти только в устройствах с барометром (мы рассмотрим датчики позже в этой серии), но это ценная информация, если вы сможете ее получить.
  • AltitudeAccuracy точно так же, как и наше другое значение Accuracy, за исключением того, что это просто предел погрешности для значения Altitude. Это означает, что вы + или — это много метров.
  • Направление также будет отображаться только с соответствующим датчиком, компасом. Это меры в градусах относительно истинного севера.
  • Технически скорость можно рассчитать, отслеживая значения долготы / долготы во времени, но они сделали ее невероятно простой для нас. Он измеряется в метрах / секунду, но это необязательное значение, которое может предоставить датчик GPS устройства. Это означает, что не все устройства будут возвращать значение.

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

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {};

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

14-XAML-интерфейс

Итак, мы собрали наши данные о местоположении, но есть еще тот обработчик событий «StatusChanged», который мы создали ранее. Это не то, что мы обычно предоставляем нашему пользователю прямой доступ, поскольку это больше административные данные для нас, но тем не менее это интересный набор данных. Может иметь шесть разных значений:

  • notInitialized возвращается, когда ваше приложение еще не запросило разрешение на доступ к данным о местоположении.
  • отключено — это значение, которое вы получите, когда пользователь отклонит ваш запрос на доступ к информации о своем местоположении.
  • notAvailable возвращается, если устройство пользователя не поддерживает данные о местоположении.
  • noData возвращается, если устройство пользователя поддерживает местоположение, но не может получить его. Это может произойти в сценарии, когда устройство не подключено к Wi-Fi, а находится, например, в здании.
  • инициализация — это значение состояния, которое вы получите между временем, когда пользователь предоставляет доступ к данным местоположения, и временем, когда вы фактически начинаете получать эти данные. При дальнейшем использовании вашего приложения оно также будет отправлено, когда ваше приложение ожидает доступа к данным о местоположении в первый раз.
  • ready — это золотой ответ, который позволяет вам знать, что данные доступны для вашего использования.

Итак, пример, который я привел вам в этой статье, позволяет вам распознавать каждый раз, когда изменяются данные о местоположении вашего пользователя, и тот, для которого есть миллионы вариантов использования. Если вам нужны только эти данные ОДНАЖДЫ, скажем, чтобы пометить изображение, которое только что сделал пользователь, вы просто делаете запрос к объекту Geolocator без необходимости создавать все события, которые я описал выше. В методе ниже мы можем сделать один простой вызов метода GetGeopositionAsync ().

async private void GetLocationDataOnce()

{

    Geoposition position = await location.GetGeopositionAsync().AsTask();

    LatitudeValue.Text = position.Coordinate.Latitude.ToString();

    LongitudeValue.Text = position.Coordinate.Longitude.ToString();

    AccuracyValue.Text = position.Coordinate.Accuracy.ToString();

}

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

Использование симулятора, чтобы подделать его

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

14-XAML-SimulatorOption

На этом этапе вы можете указать значения широты, долготы, высоты и точности:

14-XAML-SimulatorSettings

Так что у вас есть это! Теперь вы можете написать приложение, которое может определить, где находится устройство пользователя, и пока вы его создаете, вы можете притвориться, что находитесь где угодно на Земле. Не плохой способ путешествовать … по крайней мере, затраты низкие.:)

Резюме

Сегодня мы поговорили о данных геолокации и о том, насколько они важны для любого приложения на рынке. Мы смотрели на отслеживание местоположения пользователя, а также на получение его местоположения один раз, для приложений, которым просто нужно конкретное местоположение «прямо сейчас», но не всегда.

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

downloadXAML

Завтра мы рассмотрим экранную клавиатуру, InputScopes и TextBoxes. Увидимся позже!

downloadTheTools