GPSによる位置情報の取得と加速度センサー

2011年11月11日(金)
PROJECT KySS

次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックして開き、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On

単一のAPI を使用して、コンピューターの場所に容易にアクセスできる機能を提供するクラスの含まれる、System.Device.Location名前空間をインポートします。
Imports System.Device.Location

Windows PhoneのためのBing Maps Silverlightクラスの含まれる、Microsoft.Phone.Controls.Maps名前空間をインポートしておきます。
Imports Microsoft.Phone.Controls.Maps

Partial Public Class MainPage
  Inherits PhoneApplicationPage
  
  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub

GeoCoordinateWatcherクラスの新しいインスタンスであるmyGeoCoordiWatcherメンバ変数を宣言します。
GeoCoordinateWatcherクラスは、緯度および経度の座標に基づく場所データを提供するクラスです。
  Dim myGeoCoordiWatcher As New GeoCoordinateWatcher

ページが読み込まれた時の処理

MapのZoomLevelプロパティに10を指定します。このプロパティに値を指定しなければ、該当する位置が拡大表示されませんので、注意してください。
AddHandlerメソッドでGPS の位置情報が変化すると発生する、PositionChangedイベントに、イベントハンドラを追加します。イベントハンドラ内では、Dispatcher が関連付けられているスレッドで、デリゲートを非同期的に実行するmyPositionChangedイベントを、BeginInvokeメソッドで呼び出します。
Startメソッドで、GPS入力を開始します。

  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Map1.ZoomLevel = 10
    AddHandler myGeoCoordiWatcher.PositionChanged, Sub(geoSender As Object, geoArgs As GeoPositionChangedEventArgs(Of GeoCoordinate))

Deployment.Current.Dispatcher.BeginInvoke(Sub() myPositionChanged(geoArgs))
                                                      End Sub
    myGeoCoordiWatcher.Start()
  End Sub

非同期で呼び出されるmyPositionChangedイベントの処理

緯度と経度を、引数である GeoPositionChangedEventArgs の 、Posiotion.Location.Latitude と Position.Location.Longitude から取得し、変数myLatitudeとmyLongitudeに格納しておきます。
地図を任意の位置に移動させるには、ダブル型の変数myLatitudeとmyLongitudeの値を指定したGeoCoordinateを、MapのCenterプロパティに指定します。
PushPinクラスの新しいインスタンスmyPinオブジェクトを生成します。Locationプロパティに、GeoCoordinateメソッドを使って緯度と経度を指定します。Contentプロパティには、文字列に変換した経度と緯度を、「-」で連結して指定します。ピン上に緯度と経度が表示されます。緯度と経度とContentの指定されたmyPinオブジェクトをAddメソッドでMapに追加します。これで、GPSで取得された位置にピンが表示され、ピンの中に現在地情報が表示されます。
  Private Sub myPositionChanged(myPosition As GeoPositionChangedEventArgs(Of GeoCoordinate))
    Map1.Children.Clear()  
    Dim myLatitude As Double = myPosition.Position.Location.Latitude
    Dim myLongitude As Double = myPosition.Position.Location.Longitude
 
    Map1.Center = New GeoCoordinate(myLatitude, myLongitude)
 
    Dim myPin As New Pushpin
    myPin.Location = New GeoCoordinate(myLatitude, myLongitude)
    myPin.Content = myLatitude.ToString & "-" & myLongitude
    Map1.Children.Add(myPin)
  End Sub

アプリケーション終了時の処理

StopメソッドでGPS入力を停止します。
  Private Sub MainPage_Unloaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Unloaded
    myGeoCoordiWatcher.Stop()
    myGeoCoordiWatcher = Nothing
  End Sub

[航空写真]ボタンをクリックした時の処理

Buttonコントロールのテキストにより、条件分岐を行います。
Buttonコントロールのテキストが「航空写真」の場合は、地図の表示を航空写真モード(AerialMode)に切り替えます。Buttonコントロールのテキストを、「道路表示」に切り替えます。
Buttonコントロールのテキストが「道路表示」の場合は、地図の表示を道路表示モード(RoadMode)に切り替えます。Buttonコントロールのテキストを、「航空写真」に切り替えます。
  Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Select Case Button1.Content.ToString
      Case "航空写真"
        Map1.Mode = New AerialMode
        Button1.Content = "道路表示"
      Case "道路表示"
        Map1.Mode = New RoadMode
        Button1.Content = "航空写真"
    End Select
  End Sub
End Class

以上のコードを書けたら、実機で動作確認をしてみましょう。USBケーブルで実機を接続すると、Zuneが自動的に起動します。VS2010からデプロイ先に「Windows Phone Device」を選択して、「デバッグ(D) /デバッグ開始(S)」を選択します。プログラムが実機(IS12T)にデプロイされ、実機で動作します。

プログラムを削除する時は、プログラムのタイトルをホールドして表示される「削除」メニューを選択します。

  • 「GPSによる位置情報の取得」サンプルプログラム

  • 「加速度センサーで、傾斜角度を測る」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています