連載 :
Windows Phone Tips集GPSによる位置情報の取得と加速度センサー
2011年11月11日(金)

次に、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による位置情報の取得」サンプルプログラム
「加速度センサーで、傾斜角度を測る」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- ContextMenuコントロールを使う、加速度センサー、GPSでの位置情報取得
- 「住所の位置をBing Mapsに表示する」と「位置に画像付きピンを表示する」のサンプル
- 駅マスタ検索APIとBingMaps
- 入力された住所の位置をBing Mapsに表示する
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- 加速度センサーやジャイロスコープセンサーを使った、3つのセンサーサンプル
- カメラで写した写真を分離ストレージに保存し、写真の一覧を表示する
- センサーとサウンドの処理を組み込んでアプリを完成させる
- 地震の震源地を表示する
- バーコードをスキャンする