連載
» 2012年02月15日 00時00分 UPDATE

Silverlightベースで作るWP7アプリ開発入門(9):スマホに欠かせない位置情報/地図を使うアプリを作るには (1/3)

[泉本優輝,WP Arch]

スマホに欠かせない位置情報をWindows Phoneでも

 前回の「Windows PhoneをShake!加速度センサアプリを作る」では、加速度センサを利用してオブジェクトを操作したり、端末をシェイクしてイベントを実行する方法を紹介しました。今回はGPSを使って、位置情報を取得する方法を紹介します。

 スマートフォンの最も便利な機能の1つに、地図を使った現在地周辺の施設検索があります。iPhoneAndroidではGoogle MapsWindows PhoneではBing Mapsがデフォルトで用意されています。また、TwitterFacebookといった主要なソーシャルネットワークSNSでも位置情報が使われています。

 もはやスマートフォンに位置情報は欠かせない機能になっています。Windows Phoneでは、そんな位置情報も簡単に取得、シミュレーションできます。

位置情報を取得するには

 はじめに、経度緯度の値を取得しましょう。Expression BlendでWindows Phoneプロジェクトを作成し、TextBlockを2つ並べて、それぞれに「Latitude」「Longitude」と名前を付けます。

値を表示するTextBlockを設置 値を表示するTextBlockを設置

 プロジェクトをVisual Studioで開き、参照設定にSystem.Device.dllを追加します。

System.Device.dllを参照に追加 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();
        }
    }
}

 実機で実行してみましょう。端末に現在の経度緯度が表示されると思います。

実行結果:取得した経度緯度をテキストで表示 実行結果:取得した経度緯度をテキストで表示

 次ページでは、位置情報をシミュレートしたり、現在地を取得して地図で確認したりします。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。