使ってみよう! Bing API/SDK

第30回 はじめよう!Metro スタイル アプリ開発──使ってみよう!Bing Maps SDK for Metro style apps

この記事を読むのに必要な時間:およそ 7 分

位置情報を使った地図の操作

デバイスのGPSなどのセンサーを利用して,位置情報を取得するプログラムを書いてみましょう。そして,取得した位置にプッシュピンを配置します。

アプリ マニフェストの編集

Metro スタイル アプリで位置情報を取得するには,あらかじめアプリ マニフェスト ファイルを編集し,アプリが位置情報を取得する機能があることを記述しておく必要があります。

アプリ マニフェストは,プロジェクトに含まれているPackage.appxmanifestファイルに,Windowsストアで公開する際に使うロゴ画像や,アプリが必要としている機能などが記述されています。ソリューションエクスプローラーから選択して開くと,マニフェスト デザイナーが開きます。

位置情報を取得する場合,⁠機能」タブを開き,⁠場所」をチェックします図12⁠。

図12 アプリ マニフェストの編集

図12 アプリ マニフェストの編集

位置情報の取得

Metro スタイル アプリでは,位置情報の取得にGeolocatorクラスのGetGeopositionAsyncメソッドを使います。経緯度は,結果のGeopositionオブジェクトのCoordinate.Latitudeプロパティと Coordinate.Longitudeプロパティからわかります。

位置を取得するコードは次のようになります。次のDisplayPositionメソッドをコードに追加して,コンストラクタから呼び出すようにしてみましょう。基本的な操作で書いたコードはコメントアウトしておきます。

MainPage.xaml.vb ⁠Visual Basicの場合)

' (ファイルの先頭に Imports Windows.Devices.Geolocation を追加すること)
Private Geolocator As New Geolocator
Private Async Sub DisplayPosition()
    Try
        ' 位置情報の取得
        Dim pos = Await Geolocator.GetGeopositionAsync

        ' 位置情報から経緯度を参照し Location オブジェクトを生成
        Dim loc = New Location(pos.Coordinate.Latitude, pos.Coordinate.Longitude)

        ' PushPin オブジェクトの生成
        ' プッシュピンをタップすると都道府県と市区町村を表示するようにする
        Dim pin = New Bing.Maps.Pushpin
        AddHandler pin.Tapped,
           Async Sub()
               Dim dialog = New Windows.UI.Popups.MessageDialog(
                            "Country = " & pos.CivicAddress.Country)
               Await dialog.ShowAsync()
           End Sub

        ' 地図からプッシュピンを削除してから,新しいプッシュピンを追加
        MapLayer.SetPosition(pin, loc)
        MyMap.Children.Clear()
        MyMap.Children.Add(pin)

        ' 地図をプッシュピンの位置まで移動
        MyMap.SetView(loc, 15)

    Catch authEx As System.UnauthorizedAccessException
        ' (位置情報の取得をユーザーにブロックされた場合)
    Catch ex As Exception
        ' Ignore
    End Try
End Sub

MainPage.xaml.cs ⁠C#の場合)

// (ファイルの先頭に using Windows.Devices.Geolocation; を追加すること)
private Geolocator Geolocator;
private async void DisplayPosition()
{
    if (Geolocator == null) Geolocator = new Geolocator();

    try
    {
        // 位置情報の取得
        var pos = await Geolocator.GetGeopositionAsync();

        // 位置情報から経緯度を参照し Location オブジェクトを生成
        var loc = new Location(pos.Coordinate.Latitude, pos.Coordinate.Longitude);

        // PushPin オブジェクトの生成
        // プッシュピンをタップすると都道府県と市区町村を表示するようにする
        var pin = new Bing.Maps.Pushpin();
        pin.Tapped += async (sender, e) =>
        {
            var dialog = new Windows.UI.Popups.MessageDialog(
                            "Country = " + pos.CivicAddress.Country);
            await dialog.ShowAsync();
        };

        // 地図からプッシュピンを削除してから,新しいプッシュピンを追加
        MapLayer.SetPosition(pin, loc);
        MyMap.Children.Clear();
        MyMap.Children.Add(pin);

        // 地図をプッシュピンの位置まで移動
        MyMap.SetView(loc, 15);
    }
    catch (System.UnauthorizedAccessException)
    {
        // (位置情報の取得をユーザーにブロックされた場合)
    }
    catch (Exception)
    {
        // Ignore
    }
}

はじめてアプリを実行すると,図13のように位置情報の取得の許可を求められます。ここでユーザーがブロックすると例外が発生し,情報はもちろん取得できません。

図13 位置情報の取得の確認ダイアログ

図13 位置情報の取得の確認ダイアログ

上記のコードでは,プッシュピンをタップすると,取得した位置情報を使って,国情報の表示をするようにも書いています。

この例では,1回のみ位置情報を取得し地図を移動していますが,PositionChangedイベントを使って場所が変化するたびに地図を移動するようにも簡単にできます。

Visual Basicの場合

AddHandler Geolocator.PositionChanged,
    Async Sub(s, e)
        Await Me.Dispatcher.RunAsync(
            Windows.UI.Core.CoreDispatcherPriority.Normal, New Windows.UI.Core.DispatchedHandler(
                Sub()
                    Dim loc = New Location(e.Position.Coordinate.Latitude, e.Position.Coordinate.Longitude)
                    MyMap.SetView(loc, 15)
                End Sub))
    End Sub

C#の場合

Geolocator.PositionChanged += async (s, e) =>
{
    await this.Dispatcher.RunAsync(
        Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(
            () =>
            {
                var loc = new Location(e.Position.Coordinate.Latitude, e.Position.Coordinate.Longitude);
                MyMap.SetView(loc, 15);
            }));
};

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp