Карты и гелокационные данные на Windows Phone
После того, как проект будет создан, посмотрите, на какие библиотеки он ссылается. Обратите внимание, что теперь проект ссылается на Microsoft.Phone.Controls.Map. Двойным щелчком перейдем к странице MainPage.xaml и посмотрим, что изменилось в XAML коде. Добавился элемент управления Map из пространства имён my:
Посмотрев на заголовок XAML документа можно увидеть, что это за пространство имён:
Давайте заменим my на map, чтобы название пространства имён соответствовало его содержанию:
Отредактируем XAML код элемента управления Map или воспользуемся панелью Properites так, чтобы элемент занимал большую часть свободного пространства и переименуем элемент в MyMap:
Запустите приложение (F5) и посмотрите, как выглядит элемент управления во время исполнения. Обратили внимание на белый баннер в центре экрана, который говорит, что у нас неправильные авторизационные данные? Это потому что этот элемент управления использует сервис карт от Bing и для его использования требуется регистрация. Зарегистрироваться и получить ключ можно на портале Bing Maps: http://www.bingmapsportal.com. В завершение регистрации разработчик получает строковый ключ, который надо указать в свойстве CredentialsProvider элмента управления, также его можно вынести в ресурсы или данные. Добавим простые элементы управления картой: уменьшение/увеличение масштаба, смена режима отображения карты.
И обработаем эти события в коде приложения.
Не забудьте добавить в блок using следующую директиву:
Запустите приложение (F5) и проверьте, что наши элементы управления работают, как предполагается. В соответствии с Metro-дизайном панель с кнопками внизу окна приложения мы должны были бы оформить в виде Application Bar, только в целях упрощения примера мы используем более простой вариант. В качестве самостоятельного упражнения можете попробовать убрать кнопки, раскоментировать пример кода Application Bar в XAML файле и переделать приложение в соответствии со стилем Metro. Теперь перейдём к геолокационным сервисам, доступным на телефоне. Сервис предоставляет информацию, используя комбинацию информации получаемой от Wi-Fi, сотовой связи и данных от GPS приёмника. Добавим теперь в наще приложение возможности предоставляемые сервисами геолокации. Для начала, добавим в блок using следующую директиву:
Теперь мы готовы работать с сервисами локаций/местоположения. Сначала напишем простое дополнение к нашей программе, которое будет центрировать карту в соответствии с гелолокационными данными, полученными от сервисов. Добавим в класс определение переменной типа GeoCoordinateWatcher, которая позволит нам инициализировать сервисы геолокации и полчать от них данные.
В конструктор класса, сразу же после кода относящегося к акселерометру добавим код инициализации и регистрации на события изменения статуса сервисов (они могут быть недоступны, могут быть не готовы и т.д.) и события изменения положения.
Хорошее приложение должно правильно обрабатывать статусы геосервисов, т.к. они не всегда могут выдавать данные и могут тратить достаточно большое время на инициализацию. Для начала мы просто оставим обработчик пустым, так как тестировать приложением мы будем на эмуляторе, и там эти проблемы отсутствуют. Также правильнее будет поместить запуск сервиса геолокации в отдельный поток, чтобы не тормозить загрузку приложения, в нашем первом варианте приложения, с учётом использования эмулятора мы пока будем запускать сервис прямо в конструкторе класса:
Если Visual Studio автоматически сгенерировала нам обработчики событий StatusChanged и PositionChanged, закомментируйте или сотрите код в этих методах, вызывающий исключение NotImplemented:
В обработчик события PositionChanged добавьте код, центрирующий карту при изменении позиции:
Запустите приложение (F5) и воспользуйтесь возможностями эмулятора по эмуляции геолкационных данных, чтобы проверить работу программы. Увеличьте масштаб так, чтобы убедиться, что позиционирование происходи правильно. Следующим шагом, улучшения нашей программы может стать запуск сервисов в другом потоке, добавление строки статуса геолокационных данных, а также создание на карте точки, отмечающей наше местоположение. Для использования потоков, добавим в блок using следующую директиву:
В конструкторе до запуска сервисов добавим код:
После этого создадим функцию, не принимающую и не возвращающую значений, с именем startMyGeoWotcher и перенесём в неё код запуска сервисов:
Теперь добавим элемент управление TextBlock для отображения статуса сервисов геолокации
И допишем вывод статусов в обработчик StatusChanged:
Наконец, в обработчик события изменения позиции добавим установку точки на карте. В класс добавим переменную типа Pushpin:
Создадим её в конструкторе класса:
В обработчике изменения позиции установим её на текущую позицию и добавим на карту, если её там нет:
Запустите приложение (F5) и воспользуйтесь возможностями эмулятора по эмуляции геолкационных данных, чтобы проверить работу программы. Увеличьте масштаб так, чтобы убедиться, что позиционирование и установка точки происходит правильно; также проверьте отображаемый статус сервисов геолокации. Работать с потоками из пула — это более правльная практика. Ниже привожу код, который необходимо поменять, чтобы работать с потоками из пула, а не вызывать
Вместо
нужно написать следующий код:
Мы вынуждены передвать объект в метод, потому что использование пула требует статическогом метода и у нас есть 2 варианта, либо делать объект статическим, либо передать его в качестве параметра. Теперь нужно переписать метод
Он должен теперь выглядеть следующим образом:
Полезные ссылки: |