Bing Maps上の好きな場所をマークして情報を表示するプログラムを作る
次に、ソリューションエクスプローラー内の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アプリ
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Bing Maps上に地震の震源地を表示するプログラムを作る
- APIを使って土地の公示価格を調べるプログラムを作る
- 場所と写真を記録するプログラムを作って思い出のシーンを保存しよう
- フリーハンドで書いた住所を認識してBing Map上に表示する
- 自分の現在位置を取得して表示するサンプルプログラム
- 現在位置の近くにある宿を検索するサンプルプログラム
- 現在位置近くの病院を素早く検索するサンプルプログラム
- 写真と現在位置を入れた画像日記アプリを作る
- 「住所の位置をBing Mapsに表示する」と「位置に画像付きピンを表示する」のサンプル
- Yahoo!ローカルサーチAPIを使って地図上にランドマークを表示させるプログラムを作る