使ってみよう! Bing API/SDK

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

はじめよう!Metro スタイル アプリ開発

おひさしぶりです。6月にWindows 8 Release Previewが公開されました。また、開発環境のVisual Studio 2012 RCも公開されています。皆さんは、実際に使ってみましたか? Windows 8では、新しい種類のアプリ「Metro スタイル アプリ」が登場しました。

Metro スタイル アプリは、これまでのアプリと比べ、既定ではデバイスの画面全体に表示され、ひとつのアプリに専念して使えます。また、快適なタッチによる操作をサポートします。

さて、この連載ではこれまでにさまざまなBing Maps関連のAPI・SDKを紹介してきましたが、Windows 8 Release Previewに併せて、Metro スタイル アプリ向けのBing Maps SDKも新しく提供されました。さっそく、新しいSDKで、Metro スタイル アプリを開発してみましょう!図1

図1 Windows 8 Metro スタイル アプリの開発
図1 Windows 8 Metro スタイル アプリの開発

Metro スタイル アプリの地図アプリ開発の紹介となりますので、Metro スタイル アプリの開発全般については、デベロッパー センターのMetro スタイル アプリ開発も参照してください。

開発環境の準備

開発は、Windows 8 Release PreviewVisual Studio 2012 RCで行います。まずは、最新の環境を準備してください。

無償で提供されているVisual Studio Expressをインストールする場合は、Metro スタイル アプリ開発用の、Visual Studio Express 2012 RC for Windows 8を選択します。早期リリースバージョンであるVisual Studio 2012 RCは、すべてのエディションが無償で使えます。

Bing Maps SDK

続いて Bing Maps SDK を準備しましょう。Metro スタイル アプリ向けのBing Maps SDKは、Windows 8 Release Previewの公開後、一足遅れて、Bing Maps SDK for Metro style apps (RP)が提供されています。

Bing Maps SDK for metro style appsのダウンロードおよびインストールは、Visual Studioの「ツール」メニューの「拡張機能と更新」から行えます図2⁠。Webサイトからダウンロードしてインストールもできます。

図2 Bing Maps SDKのダウンロードとインストール
図2 Bing Maps SDKのダウンロードとインストール

インストール後、Visual Studioを再起動します。

Bing Maps Keyの取得

Bing Maps SDKの地図コントロールを使うには、これまでの連載と同じくBing Maps Keyが必要です。Bing Maps Account Centerに、サインインしてBing Maps Keyを取得します。はじめて使う場合は、アカウントの登録が必要です図3⁠。また、Metro スタイル アプリの利用規約Terms of Useは、これまでのBing Maps APIの利用規約とは別に用意されていますので注意してください。

図3 アカウントの登録
図3 アカウントの登録

Bing Maps Keyは、メニューの「Create or view keys」から新しく作れます図4⁠。Application typeは、⁠Metro style app (BETA)」を選びます。Submitボタンをクリックすると、新しくキーが生成され同じページにキーのリストが表示されます。

図4 Bing Maps Keyの作成
図4 Bing Maps Keyの作成

Metro スタイル アプリ プロジェクトの作成

それでは、Visual StudioでMetro スタイル アプリのプロジェクトを新規作成しましょう。Metro スタイル アプリは、C++、C#、Visual Basic、JavaScriptのどれでも開発できます。Bing Maps SDKを利用する場合も、どの言語でも開発できます。

今回は、C#・Visual Basicを使います。メニューの「ファイル」「新しいプロジェクト」から、図5のように「Windows Metro style」「Blank App (XAML)」を選択して、プロジェクトを作成します。ここではアプリ名を「SampleMapApp」としました。

図5 プロジェクトの新規作成
図5 プロジェクトの新規作成

Bing Maps SDKの参照

プロジェクトでBing Maps SDKを利用するため、プロジェクトからSDKを参照します。メニュー「プロジェクト」「参照の追加」から、参照マネージャーを開きます。図6のように、Windowsの拡張子にある「Bing Maps for C#, C++, or Visual Basic (RP)」をチェックします。また、C#とVisual Basicのプロジェクトの場合、⁠Microsoft Visual C++ Runtime Package」も必要ですので、併せてチェックします。OKボタンをクリックして完了です。

図6 Bing Maps SDKとC++ランタイム パッケージの参照
図6 Bing Maps SDKとC++ランタイム パッケージの参照

構成の変更

続いて、メニュー「ビルド」「構成マネージャー」から、構成マネージャーを開きます図7⁠。プラットフォームに「Any CPU」が選択されていると思いますが、このままではBing Maps SDKが使えません。作成するアプリのプラットフォームに合わせて、ARM・x64・x86のいずれかを選びます。DebugとReleaseの両方の構成を変更しておきましょう。

図7 構成の変更
図7 構成の変更

以上で、地図アプリのためのプロジェクトができました。

地図の表示

それでは、地図を表示させてみましょう。

プロジェクト内のMainPage.xamlを開きます。XAMLの編集画面で、Pageタグに名前空間の宣言を追加します。

xmlns:bm="using:Bing.Maps"

Gridタグの中に、次のようにMapコントロールを追加します。BING_MAPS_KEYの部分は、作成したBing Maps Keyの値に置き換えてください。

<bm:Map Credentials="BING_MAPS_KEY" x:Name="MyMap"></bm:Map>

ここまでの内容は図8のようになります。

図8 Mapコントロールの追加
図8 Mapコントロールの追加

ここまでを実行してみましょう。図9のようにツールバーでローカルコンピューターを選択して、デバッグを開始します。

図9 デバッグの実行
図9 デバッグの実行

アプリが起動して、画面全体に地図が表示されましたね。動作を確認したら、Visual Studioの画面に戻って、実行を停止します(メニュー「デバッグ」「デバッグの停止⁠⁠。

ここで、ローカルコンピューターのかわりにSimulatorを選択して実行すると、タブレットのシミュレーターで動作確認ができます図10⁠。右側にある各ボタンから、デバイスの解像度の変更や回転、経緯度の指定などが行えます。

図10 シミュレーターでのデバッグ
図10 シミュレーターでのデバッグ

基本的な地図の操作

次は、基本的な地図の操作をしてみましょう。

MainPage.xaml.vb(C#の場合は、MainPage.xaml.cs)ファイルを、ソリューションエクスプローラーから開きます。ここに地図の基本的な操作を行うコードを書いていきます。

次のようコンストラクタを追加して、地図を操作するコードを書きます。コードでは、表示する地点の指定、ズームレベルの指定、地図の種類の指定、そして、プッシュピンの追加を行っています。

MainPage.xaml.vb ⁠Visual Basicの場合)
' (ファイルの先頭に Imports Bing.Maps を追加すること)
Sub New()
    InitializeComponent()

    ' 地図の中心の経緯度の指定
    MyMap.Center = New Location(35.71, 139.8107)

    ' ズームレベルの指定
    MyMap.ZoomLevel = 17.5

    ' 地図の種類の指定
    MyMap.MapType = MapType.Birdseye

    ' プッシュピンの追加
    Dim pin = New Bing.Maps.Pushpin
    MapLayer.SetPosition(pin, New Location(35.71, 139.8107))
    MyMap.Children.Add(pin)
End Sub

C#の場合は、既に記述されているコンストラクタに追記します。

MainPage.xaml.cs ⁠C#の場合)
// (ファイルの先頭に using Bing.Maps; を追加すること)
public MainPage()
{
    this.InitializeComponent();

    // 地図の中心の経緯度の指定
    MyMap.Center = new Location(35.71, 139.8107);

    // ズームレベルの指定
    MyMap.ZoomLevel = 17.5;

    // 地図の種類の指定
    MyMap.MapType = MapType.Birdseye;

    // プッシュピンの追加
    var pin = new Bing.Maps.Pushpin();
    MapLayer.SetPosition(pin, new Location(35.71, 139.8107));
    MyMap.Children.Add(pin);
}

ここまでを実行すると、小さい東京スカイツリーが表示されます図11⁠。執筆時点で使われている航空写真(概観図)は、建設前のようですね。また、概観図の場合、日本語とアルファベットの地名の表記が混じっています。プッシュピンは、図のように丸いオブジェクトで表現されます。

図11 地図の基本的な操作
図11 地図の基本的な操作

同じ内容をXAMLで記述すると次のようになります。

MainPage.xaml
<bm:Map Credentials="BingMapsKey"
        Name="MyMap"
        ZoomLevel="17.5">
    <bm:Map.Center>
        <bm:Location Latitude="35.71" Longitude="139.8107" />
    </bm:Map.Center>
    <bm:Map.Children>
        <bm:Pushpin>
            <bm:MapLayer.Position>
                <bm:Location Latitude="35.71" Longitude="139.8107" />
            </bm:MapLayer.Position>
        </bm:Pushpin>
    </bm:Map.Children>
</bm:Map>

ちなみに、C++のプロジェクトを選択した場合も同様にXAMLを記述して同じMetroスタイル アプリが作れます。

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

デバイスの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);
            }));
};

アプリ バーの追加

Metro スタイル アプリでは、コンテンツを操作するコマンドを表示する方法のひとつとして、アプリ バーがあります。Bing Maps SDKに直接かかわる内容ではありませんが、よりアプリらしくするため、アプリにアプリ バーを追加してみましょう。

図14 Windows 8の地図アプリのアプリ バー
図14 Windows 8の地図アプリのアプリ バー

アプリ バーは、コンテンツのコマンドをオンデマンドで表示するために使います。既定ではアプリ バーは非表示です。画面の下から上へスワイプ動作で表示します。マウス操作の場合、右クリックで表示します。

今回は、現在地を表示するボタンをアプリ バーに追加します。コマンドの動作は、作成済みのDisplayPositionメソッドを呼び出します。今回は1個のボタンだけですが、ボタンの配置は、タッチで操作しやすいよう両端に配置します。コマンドが少ない場合や、永続的なコマンドは、右側に配置するようガイドラインで決められています。詳しくは、Metro スタイル アプリのコマンド実行の設計を参照するとよいでしょう。

それでは、アプリにアプリ バーを追加しましょう。XAMLのコードのPageタグの中に次のように記述します。Tappedイベントで作成済みのDisplayPositionメソッドを呼んでいます。

MainPage.xaml
<Page.BottomAppBar>
    <AppBar Padding="10,0,10,0">
        <Grid>
            <Button HorizontalAlignment="Right" 
                    Tapped="DisplayPosition"
                    Style="{StaticResource HomeAppBarButtonStyle}" />
        </Grid>
    </AppBar>
</Page.BottomAppBar>

以上で、基本的なところは完了です。追加されたボタンをみてみると、Metro スタイル アプリらしい丸枠の家のアイコンになっています図15⁠。

図15 アプリ バーのボタン
図15 アプリ バーのボタン

これは定義済みのスタイルを利用しています。どこで定義されているかというと、プロジェクトのCommonフォルダーの中のStandardStyles.xamlです。この中のHomeAppBarButtonStyleを利用しました。ほかにも、基本的なボタンのスタイルが定義されています。

ただし、このままではアイコンとコマンド名がマッチしていませんので、自分でスタイルを用意しましょう。StandardStyles.xamlで定義されていないスタイルのアイコンも簡単に追加できます。Pageタグに次のような定義を追加します。

MainPage.xaml
<Page.Resources>
    <Style x:Key="LocationAppBarButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource AppBarButtonStyle}">
        <Setter Property="AutomationProperties.AutomationId" Value="LocationAppBarButton"/>
        <Setter Property="AutomationProperties.Name" Value="現在地"/>
        <Setter Property="Content" Value="&#xE139;"/>
    </Style>
</Page.Resources>

Buttonタグは次のようにStyle部分を変更します。

<Button HorizontalAlignment="Right" 
        Tapped="DisplayPosition"
        Style="{StaticResource LocationAppBarButtonStyle}" />

ボタンは図16のようになります。

図16 修正後のボタン
図16 修正後のボタン

Windows 8では、Segoe UI Symbolフォントにボタンに使えそうなアイコンが定義されています。Windows 8のスタート画面を表示しているとき、⁠charmap」と入力して文字コード表を起動してください。

図17 文字コード表
図17 文字コード表

文字コード表で、イラストの確認ができます図17⁠。ステータスバーに表示される「U+E114」などの値を上記コードの「Value="&#xE139;」部分を「Value="&#xE114;」のように変更すると、そのアイコンのボタンに変更できます。

おわりに

今回は、ここまでです。いかがでしたか。Metro スタイル アプリでもこれまでと同様、簡単に地図アプリが開発できました。今回紹介した内容以外にも、次の機能なども使えます。

  • ルートや領域を示す、ポリライン・ポリゴンの表示
  • オリジナルの地図のタイル画像の表示
  • 交通情報の表示

各プラットフォームで提供されているBing Maps SDKはそれぞれ少し異なっています。今回利用したC++・C#・Visual Basic用のMetro スタイル アプリの地図コントロールは、すべての機能が詰まっているわけではありません。執筆時点では、屋内の地図の表示などは対応していないようです。

簡単にBing Mapsの地図コントロールが使えたほか、Metro スタイル アプリ自身も、C#・Visual Basicを使っていれば、比較的 簡単に開発できたのではないでしょうか。ただし、アプリは、これまでのデスクトップアプリとは、見た目も仕組みも、まったく異なります。Windowsストアで公開するため、審査に通る必要もあります。Metro スタイル アプリのためのガイドラインが、デベロッパーセンターに公開されていますので、少しずつ読み進めると良いかもしれませんね。

おすすめ記事

記事・ニュース一覧