PR

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)にデプロイされ、実機で動作します。

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

Think IT会員限定特典
  • 「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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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

GPSによる位置情報の取得と加速度センサー | Think IT(シンクイット)

Think IT(シンクイット)

サイトに予期せぬエラーが起こりました。しばらくたってから再度お試しください。