Bing Maps上の好きな場所をマークして情報を表示するプログラムを作る

2013年2月28日(木)
薬師寺 国安

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。

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

リスト2 (MainWindow.xaml.vb)

Option Strict On

Bing Mapsに関するクラスの含まれるBing.Maps名前空間をインポートします。

Imports Bing.Maps

コアシステムの機能とその UI についてのランタイム情報にアクセスするアプリケーションを提供するクラスの含まれる、Windows.UI名前空間をインポートします。地図上に表示するピンの背景色を指定する場合等に、この名前空間に含まれるクラスを使用します。

Imports Windows.UI

Public NotInheritable Class MainPage
  Inherits Page
 
  Dim zIndexNo As Integer = 0

Bing Maps上のどのピンがタップされたかを判別する、1ずつ加算されるメンバ変数Indexを宣言します。

  Dim Index As Integer = 0

XMLを表すメンバ変数xmldocを宣言します。

  Dim xmldoc As XElement

ページがアクティブになった時の処理

地図の拡大レベルを8に指定しておきます。

XElement.LoadメソッドでXML文書ファイル(Michitom.xml)を読み込みます。

Descendantsメソッドですべての子孫要素であるに対して、要素を変数resultに格納しながら、反復処理を行います。

変数myLatitudeにの属性”緯度”の値を格納します。

変数myLongitudeにの属性”経度”の値を格納します。

変数numberにの属性”番号”の値を格納します。

新しいPushPinクラスのインスタンス、myPinオブジェクトを作成します。背景色にCrimsonを指定し、Textプロパティに変数numberの値(札所の番号)を指定します。

MapのCenterプロパティにDouble型に変換したmyLatitude(緯度)とmyLongitude(経度)の値を指定します。

新しいStackPanelのインスタンスmyStackPanelオブジェクトを作成します。SetValueメソッドのZIndexPropertyに1ずつ加算されるzIndexNoの値を指定します。StackPanelがPushPinよりも前面に表示されます。
myStackPanelオブジェクトの背景色にPinkを指定します。初期状態ではmyStackPanelオブジェクトを非表示としておきます。

次に、TextBlockの新しいインスタンスmyTextBlockオブジェクトを作成します。パディングに5を指定し、Textプロパティに改行を含めた、「札所番号」とお寺の名前、「所在地」を指定します。文字色はNavyで、文字サイズは20とします。

Buttonの新しいインスタンスmyButtonオブジェクトを作成します。背景色にNavy、ボタンの表面の文字に「検索」と指定します。Tagプロパティには1ずつ加算されるIndexの値を文字列に変換して指定します。このTagの値は、どのPushPinがタップされたかを判別するのに使用します。

myStackPanelオブジェクトにmyTextBlockオブジェクトを追加します。

同様にmyStackPanelオブジェクトにmyButtonオブジェクトを追加します。

MapLayerクラスのSetPositionメソッドで、マップレイヤー内に要素の位置を設定します。この場合、myLatitudeとmyLongitudeの位置にmyStackPaneオブジェクトをセットします。MapLayerクラスは、地図上の要素の位置を保持しているマップレイヤーを表すクラスです。
MapにAddメソッドでmyStackPanelオブジェクトを追加します。

MapLayerクラスのSetPositionメソッドで、myLatitudeとmyLongitudeの位置にmyPinオブジェクトをセットします。

変数Indexを1ずつ加算します。

AddHandlerステートメントで、ボタンがクリックされた時のイベントハンドラを追加します。イベントハンドラ内では以下の処理を行います。

Buttonの情報を持っているmySenderオブジェクトをButtonにキャストして、Tagプロパティの値を取得します。取得した値を変数myIndexに格納します。数値に変換したmyIndexを変数_Indexに格納します。

変数_Indexに対応する要素の内容(お寺の名前)を取得し、変数myTempleに格納します。Bing 検索Uriの引数にmyTempleの値を指定して、新しいUriを初期化し、myUriオブジェクトを作成します。

Windows.System.Launcher.LaunchUriAsynメソッドを使用して、指定された URI を既定
のハンドラーで起動します。Bingが起動して、指定したお寺名を検索して表示します。

*)このWindows.System.Launcher.LaunchUriAsynメソッドを使用したアプリは、ストアに申請した際、「認定の要件」の「2.4 アプリで提供されるプライマリ エクスペリエンスはアプリ内で行われなければならない」の項目にひっかかりリジェクトをされることがあります。Webブラウザーを開くことで価値を提供していると判断されるからです。
しかし、ここ最近の筆者が申請した、ほとんどのアプリに、この
Windows.System.Launcher.LaunchUriAsynメソッドを使用して申請しているのですが、問題なく全て認定されています。もしリジェクトされた場合は、「ブラウザで表示させるのはあくまでも補助的な意味で、アプリの価値はアプリ内で提供しています。」と一文を追加しようかと思っていたのですが、この必要性もありませんでした。このアプリで使用しているWindows.System.Launcher.LaunchUriAsynメソッドの使い方では、大丈夫ではないかと思いますが、審査員の判断によるところが大きいので、100%とはいえませんが。

ピンがタップされた時は、myStackPanelオブジェクトを表示します。札所の番号とお寺の名前、所在地が表示されます。

myStackPanelがタップされた時はmyStackPanelオブジェクトを非表示にします。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    myMap.ZoomLevel = 8
    xmldoc = XElement.Load("michitomo.xml")
    Dim myLatitude As String = String.Empty
    Dim myLongitude As String = String.Empty
    Dim number As String = String.Empty
    For Each result In From c In xmldoc.Descendants("札所") Select c
      zIndexNo = zIndexNo + 1
      myLatitude = result.Attribute("緯度").Value
      myLongitude = result.Attribute("経度").Value
      number = result.Attribute("番号").Value
 
      Dim myPin As New Pushpin
      myPin.Background = New SolidColorBrush(Colors.Crimson)
      myPin.Text = number
      myMap.Center = New Location(CDbl(myLatitude), CDbl(myLongitude))
 
      Dim myStackPanel As New StackPanel
      myStackPanel.SetValue(Canvas.ZIndexProperty, zIndexNo)
      myStackPanel.Background = New SolidColorBrush(Colors.Pink)
      myStackPanel.Visibility = Xaml.Visibility.Collapsed
  
      Dim myTextBlock As New TextBlock
      myTextBlock.Padding = New Thickness(5)
      myTextBlock.Text = number & "番札所=" &result.Value&vbCrLf& "所在地=" &result.Attribute("所在地").Value
      myTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
      myTextBlock.FontSize = 20
 
      Dim myButton As New Button
      With myButton
        .Background = New SolidColorBrush(Colors.Navy)
        .Content = "検索"
        .Tag = Index.ToString
      End With
      myStackPanel.Children.Add(myTextBlock)
      myStackPanel.Children.Add(myButton)
      MapLayer.SetPosition(myStackPanel, New Location(CDbl(myLatitude), CDbl(myLongitude)))
      myMap.Children.Add(myStackPanel)

      MapLayer.SetPosition(myPin, New Location(CDbl(myLatitude), CDbl(myLongitude)))
      myMap.Children.Add(myPin)
      Index += 1
      AddHandlermyButton.Click, Async Sub(mySender As Object, myArgs As RoutedEventArgs)
                                  Dim myIndex = DirectCast(mySender, Button).Tag
                                  Dim _Index As Integer = CInt(myIndex)
                                  Dim myTemple = xmldoc.Descendants("札所")(_Index).Value
                                  Dim myUri = New Uri("http://www.bing.com/search?q=" &Uri.EscapeDataString(myTemple))
                                  Dim mySucess = Await Windows.System.Launcher.LaunchUriAsync(myUri)
                                  If Not mySucess Then
                                    Exit Sub
                                  End If
                                End Sub
      AddHandlermyPin.Tapped, Sub()
                                  myStackPanel.Visibility = Xaml.Visibility.Visible
                                End Sub
      AddHandlermyStackPanel.Tapped, Sub()
                                  myStackPanel.Visibility = Xaml.Visibility.Collapsed
                                End Sub
     Next
  End Sub
End Class

地図の拡大縮小、表示モードの変更等はBing Mapsで自動的に処理されるため、コードを書く必要はありません。

今回はここまでです。ありがとうございました。

  • Bing Maps上にマークした場所の情報を表示するWindowsアプリ

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

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

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

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

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