前回の「Windows PhoneをShake!加速度センサアプリを作る」では、加速度センサを利用してオブジェクトを操作したり、端末をシェイクしてイベントを実行する方法を紹介しました。今回はGPSを使って、位置情報を取得する方法を紹介します。
スマートフォンの最も便利な機能の1つに、地図を使った現在地周辺の施設検索があります。iPhoneやAndroidではGoogle Maps、Windows PhoneではBing Mapsがデフォルトで用意されています。また、TwitterやFacebookといった主要なソーシャルネットワーク/SNSでも位置情報が使われています。
もはやスマートフォンに位置情報は欠かせない機能になっています。Windows Phoneでは、そんな位置情報も簡単に取得、シミュレーションできます。
はじめに、経度緯度の値を取得しましょう。Expression BlendでWindows Phoneプロジェクトを作成し、TextBlockを2つ並べて、それぞれに「Latitude」「Longitude」と名前を付けます。
プロジェクトをVisual Studioで開き、参照設定にSystem.Device.dllを追加します。
MainPage.xaml.csを開き、usingを追加します。
using System.Device.Location;
この画面に遷移したときに位置情報を使用するように記述します。
GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher();
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
       geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged);
       geoWatcher.Start();
}
 
void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
       Dispatcher.BeginInvoke(()=>
           Latitude.Text = e.Position.Location.Latitude.ToString()
       );
 
       Dispatcher.BeginInvoke(()=>
           Longitude.Text = e.Position.Location.Longitude.ToString()
       );
}
 
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
     geoWatcher.Stop();
}
遷移時のイベントには、OnNavigatedToを用います。geoCoordinateWatcherをインスタンス化し、Positionが変わるごとにgeoWatcher_PositionChangedが実行されます。
geoWatcher_PositionChangedの引数「e」から値を取得できますが、センサはUIスレッドとは別のスレッドで動作しているため、Dispatcher.BeginInvokeを使ってアクセスします。
以下がコードの全文です。
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;
 
namespace GPSLocation
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
 
        GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher();
 
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged);
 
            geoWatcher.Start();
        }
 
        void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
            Dispatcher.BeginInvoke(()=>
                Latitude.Text = e.Position.Location.Latitude.ToString()
            );
 
            Dispatcher.BeginInvoke(()=>
                Longitude.Text = e.Position.Location.Longitude.ToString()
            );
        }
 
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            geoWatcher.Stop();
        }
    }
}
実機で実行してみましょう。端末に現在の経度緯度が表示されると思います。
次ページでは、位置情報をシミュレートしたり、現在地を取得して地図で確認したりします。
Copyright © ITmedia, Inc. All Rights Reserved.