День тринадцатый. Географические координаты
Вступление
Сегодня мы поговорим о LocationServices и как мы можем получить информацию о местонахождении устройства.
Почему локация - это так важно?
Давайте представим себе, что у нас есть приложение, которое содержит (или может получить через интернет) несколько сотен схем, списков и документацию по всем продуктам и устройствам, которые вы разрабатывали для ваших клиентов. На большинстве устройств можно организовать поиск клиентов, с которыми работаем в текущий момент, найти конкретный офис или сайт, а затем разобрать через десятки документов, которые могут по-прежнему отвечают нашим критериям.
Добавив данные о местоположении, мы избравляемся от необходимости искать всех подряд. Если каждый документ был бы с меткой геолокации данных, поиск конкретных документов также становится проще. Также мы могли бы в состоянии определить, какое здание, объект или устройство рядом с нами. Таким образом, использование местоположение устройства является одним из способов удобства и эффективности работы.
Еще один показательный пример - представьте себе приложение для игры в гольф, которое позволяет ввести свои результаты, отслеживать счет, и даже поделиться этой информацией с вашими друзьями.
Немного об определении местоположения
Сущестует три способа получения данных о местонахождении устройтсва в порядке точности: GPS, вышки сотовой связи и точки доступа Wi-fi.
Использовать любой из этих способов очень просто. Не нужны несколько страниц кода, как было раньше в Windows Mobile. Требуется несколько шагов:
- Создаем новый объект GeoCoordinateWatcher
- Создаем обработчик события, отслеживающий изменения позиции устройства
- Считываем поступающие данные
Основным классом для определения местоположения является класс GeoCoordinateWatcher из пространства имен System.Device.Location. Конструктор принимает один из элементов перечисления GeoPositionAccuracy (Точность географических координат).
- Default
- High
После создания объекта GeoCoordinateWatcher необходимо задать обработчик события PositionChanged и вызвать метод Start. Событие PositionChanged возвращает объект GeoCoordinate, имеющий восемь свойств:
- Latitude (Широта). Диапазон от -90 до 90 градусов
- Longitude (Долгота). Диапазон от -180 до 180 градусов
- Altitude (Высота)
- HorizontalAccuracy и VerticalAccuracy - точность в горизонтальном или вертикальном положении
- Course (Курс). Диапазон от 0 до 360 градусов
- Speed (Скорость)
- IsUnknown (Неизвестно). Принимает значение true, если Latitude или Longitude не являются числами
Пользователь может запретить в настройках разрешать определение местоположения устройства. В этом случае Latitude и Longitude имеют значения Double.Nan, а свойство IsUnknown имеет значение true.
Ниже приведена простейшая реализация примера.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Device.Location;
using Microsoft.Phone.Tasks;
namespace Day13_LocationServices
{
public partial class MainPage : PhoneApplicationPage
{
GeoCoordinateWatcher gcw;
// Constructor
public MainPage()
{
InitializeComponent();
gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChanged);
gcw.Start();
}
void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs e)
{
Latitude.Text = e.Position.Location.Latitude.ToString();
Longitude.Text = e.Position.Location.Longitude.ToString();
}
}
}
Увы, эмулятор опять бессилен нам помочь для тестирования примера. Можно воспользоваться Reactive Extensions для эмуляции данных. На сайте MSDN есть статья
Картографические сервисы
О том, как использовать картографические сервисы можно прочитать в книге Ч.Петцольда
Использованные материалы
Реклама