X

GPSを使って位置情報を取得する

WP7でも、他スマートフォンと同様にGPSの情報を取得して、
アプリケーションで利用することが出来ます。

本エントリでは、GPS情報の取得方法と位置情報のエミュレーションについて紹介しています。

GPSの情報を取得する

GPSの情報を取得するためには、GeoCoordinateWatcherクラスを利用します。
GeoCoordinateWatcherクラスを利用するためには、プロジェクトへの参照の追加usingの追加を行う必要があります。

詳細な追加内容は以下の通りになります。

■参照の追加

Visual Studioのツールバーの「プロジェクト」→「参照の追加」からSystem.Deviceを追加する。

■using の追加

下記の通りのusing指定を追加しておきます。

using System.Device.Location;

GPSの情報は、位置情報が変化するたびに呼び出されるハンドラの内部で取得します。
このハンドラはUIスレッドとは別のスレッドで呼び出されるため、ハンドラ内でUIに関連する処理を実行する場合には、Dispatcherを利用します。

位置情報の変化を受け、TextBlockに位置情報を出力するメソッドのサンプルは以下の通りです。

       void gps_PositionChanged(object sender, GeoPositionChangedEventArgs e)
        {
            Dispatcher.BeginInvoke(delegate(){

                textBlock1.Text = e.Position.Location.Latitude.ToString() + ", " + e.Position.Location.Longitude.ToString();

            });
        }

1行目のメソッドの引数にGeoPositionChangedEventArgsを持っています。これは、GeoCoordinateWatcherに登録するハンドラの型とあわせるために指定しています。
3行目でDispatcherを呼び出し、delegate(処理の委譲)を行っています。
5行目にて、Locationを取得しています。Latitudeが緯度Longitudeが経度をあらわすプロパティです。

最後に、GeoCoordinateWatcherにPositionChangedイベントを登録する処理と、GPS情報の取得開始を行うStartメソッドを呼び出す部分を追記します。

サンプルでは、MainPageのコンストラクタ内でイベントを登録しています。

        public MainPage()
        {
            InitializeComponent();

            GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();
            watcher.PositionChanged += new EventHandler>(gps_PositionChanged);
            watcher.Start();

        }

7行目でPositionChangedプロパティにイベントハンドラを登録しています。登録しているメソッドは上記で先に取り上げたメソッドです。
8行目でGeoCoordinateWatcherを開始するためにStartメソッドを呼び出しています。

GPS情報をEmulateする

WP7のエミュレーターはGPS情報をマップ画面上にピンを立てる事でエミュレーションするための機能を保持しています。

GPSのエミュレーションを行う為のツールは、エミュレータにカーソルを当てた時に出る、
右側のツールバーより>>を選択し表示されるウィンドウ内にあります。
以下画像を参考に探してみて下さい

このGPSのエミュレーションモードには地図とのライブ対話のON/OFFの設定があります。
地図とのライブ対話とは、ピンを立てた場所に現在居ることになり、その場所のGPS情報に更新された通知をイベントハンドラで取得することが出来ます。

一方、ライブ対話をOFFにした場合には、ピンを立てた順番どおりに発生間隔に指定した間隔でイベントを通知させることができます。

スクリーンショットは、ライブ対話をOFFにし、ピンを順番に5つたてた状態です。
この状態で、イベントの開始を行うと1秒間隔(任意に設定可能)にピンをたてた場所にGPS座標がエミュレーションされ、
アプリケーションに通知されます。

UpDown-G: