APIを使って土地の公示価格を調べるプログラムを作る

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainWindow.xaml.vb)
Option Strict On
最新のHTTPアプリケーション用のプログラミングインターフェイスを提供するクラスの含まれる、System.Net.Http名前空間をインポートします。
Imports System.Net.Http
コンテテキストメニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間をインポートします。
Imports Windows.UI.Popups
Bing Mapsに関するクラスの含まれるBing.Maps名前空間をインポートします。
Imports Bing.Maps
コアシステムの機能とその UI についてのランタイム情報にアクセスするアプリケーションを提供するクラスの含まれる、Windows.UI名前空間をインポートします。
	PushPinの色を指定する場合等に、この名前空間に含まれるクラスを使用します。
Imports Windows.UI Public NotInheritable Class MainPage Inherits Page Dim _image As String
[OK]ボタンがタップされた時の処理
Bing Maps内を一度クリアしておきます。変数myUriに
	String.Format("http://db1.jyutaku.co.jp/njr/JFW/Api/?apli=chika&v=1&addr={0}&syubetsu=0&dist=1000&limit=10", Uri.EscapeDataString(searchTextBox.Text))
	と指定してRESTの文字列を格納しておきます。
	引数addrにエスケープした住所入力ボックス内の値を指定します。
	syubetsuには0を指定して、「地価公示(標準地)」とします。
	distには検索範囲距離をメートル単位で指定します。このサンプルでは1000メートル(1km)としています。
	これで返される結果XMLは図14のようになります。赤い線の引かれた要素の値を取得します。
HttpClientクラスの新しいインスタンスmyHttpClientオブジェクトを作成します。
	HttpClientクラスは、URI で識別されるリソースに HTTP 要求を送信し、そのリソースから HTTP 応答を受信するためのクラスです。
	HttpClientクラスのGetStringAsyncメソッドで、指定したURIにGET送信し、非同期操作で応答本体を文字列として受け取り、変数resultに格納します。
	XElement.Parseメソッドでresult変数の内容を文字列として読み込みます。
Descendantsメソッドで全ての子孫要素である
	Countプロパティで
変数myAddressに
	変数noの値を1ずつ加算します。この値はPushPinの表面に表示される数値です。
MapのCenterプロパティにDouble型に変換したmyLatitude(
新しいPushPinクラスのインスタンスmyPinオブジェクトを作成します。
	背景色にCrimsonを指定し、Textプロパティにピンの表面に表示される変数noの値を文字列に変換して指定します。
新しいStackPanelのインスタンスmyStackPanelオブジェクトを作成します。
	Marginプロパティに5を指定して余白を設けます。背景色にはPinkを指定します。
	myStackPanelオブジェクトを非表示としておきます。
新しいTextBlockのインスタンスmyTextBlockオブジェクトを作成します。
文字色にNavyを、文字サイズに24、パディングに5を指定し、Textプロパティに「更新年度:」という文字列とmyYear変数の値に「年」を連結して指定します。
新しいTextBlockのインスタンスmyPriceTextBlockオブジェクトを作成します。
文字色にNavyを、文字サイズに24、パディングに5を指定し、Textプロパティに「価格:」という文字列とmyPrice変数の値に「円」を連結して、三桁区切りで指定します。
新しいTextBlockのインスタンスmyDistTextBlockオブジェクトを作成します。
文字色にNavyを、文字サイズに24、パディングに5を指定し、Textプロパティに「検索地からの距離:」という文字列とmyDistance変数の値に「m」を連結して指定します。
myStackPanelオブジェクトにAddメソッドで、myTextBlock、myYearTextBlock、myPriceTextBlock、myDistTextBlockオブジェクトを追加します。
SetValueメソッドでZIndexの値に1ずつ加算される変数noの値を指定します。
	これで、StackPanelが表示された時は、PushPinより前面に表示されます。
MapLayerクラスのSetPositionメソッドで、マップレイヤー内に要素の位置を設定します。この場合、myLatitudeとmyLongitudeの位置にmyPinオブジェクトをセットします。MapLayerクラスは、地図上の要素の位置を保持しているマップレイヤーを表すクラスです。
	MapにAddメソッドでmyPinオブジェクトを追加します。
同様に、MapLayerクラスのSetPositionメソッドで、マップレイヤー内に要素の位置を設定します。この場合、myLatitudeとmyLongitudeの位置にmyStackPaneオブジェクトをセットします。MapLayerクラスは、地図上の要素の位置を保持しているマップレイヤーを表すクラスです。
	MapにAddメソッドでmyStackPanelオブジェクトを追加します。
AddHandlerステートメントで、ピンがタップされた時のイベントハンドラを追加します。
	myStackPanelを表示状態にします。
AddHandlerステートメントで、myStackPanelオブジェクトがタップされた時のイベントハンドラを追加します。
	myStackPanelを非表示状態にします。
データが存在しない場合は、警告メッセージを表示して、処理を抜けます。
  Private Async Sub OkButton_Click(sender As Object, e As RoutedEventArgs) Handles OkButton.Click
    If searchTextBox.Text<>String.Empty Then
      myMap.Children.Clear()
      Dim no As Integer = 0
      Dim myUri = String.Format("http://db1.jyutaku.co.jp/njr/JFW/Api/?apli=chika&v=1&addr={0}&syubetsu=0&dist=1000&limit=10", Uri.EscapeDataString(searchTextBox.Text))
      Dim myHttpClient As New HttpClient
      Dim resut = Await myHttpClient.GetStringAsync(myUri)
      Dim xmldoc As XElement = XElement.Parse(resut)
      Dim myQuery = From c In xmldoc.Descendants("item") Select c
      Dim resultCount = myQuery.Count
 
      If myQuery.Count> 0 Then
        For Each result In From c In xmldoc.Descendants("item") Select c
          Dim myAddress = result.Attribute("addr").Value
          Dim myYear = result.Attribute("year").Value
          Dim myPrice = result.Attribute("price_10").Value
          Dim myDistance = result.Attribute("dist").Value
          Dim myLatitude = result.Attribute("lat").Value
          Dim myLongitude = result.Attribute("lng").Value
          no += 1
          myMap.Center = New Location(CDbl(myLatitude), CDbl(myLongitude))
          Dim myPin As New Pushpin
          myPin.Background = New SolidColorBrush(Colors.Crimson)
          myPin.Text = no.ToString
          Dim myStackPanel As New StackPanel
          myStackPanel.Margin = New Thickness(5)
          myStackPanel.Background = New SolidColorBrush(Colors.Pink)
          myStackPanel.Visibility = Xaml.Visibility.Collapsed
          Dim myTextBlock As New TextBlock
          myTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
          myTextBlock.FontSize = 24
          myTextBlock.Padding = New Thickness(5)
 
          myTextBlock.Text = "住所:" &myAddress
 
          Dim myYearTextBlock As New TextBlock
          myYearTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
          myYearTextBlock.FontSize = 24
          myYearTextBlock.Padding = New Thickness(5)
          myYearTextBlock.Text = "更新年度:" &myYear& "年"
 
          Dim myPriceTextBlock As New TextBlock
          myPriceTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
          myPriceTextBlock.FontSize = 24
          myPriceTextBlock.Padding = New Thickness(5)
  
          myPriceTextBlock.Text = "価格:" &String.Format("{0:#,0}", CInt(myPrice)) & "円"
 
          Dim myDistTextBlock As New TextBlock
          myDistTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
          myDistTextBlock.FontSize = 24
          myDistTextBlock.Padding = New Thickness(5)
          myDistTextBlock.Text = "検索地からの距離:" &myDistance& "m"
          myStackPanel.Children.Add(myTextBlock)
          myStackPanel.Children.Add(myYearTextBlock)
          myStackPanel.Children.Add(myPriceTextBlock)
          myStackPanel.Children.Add(myDistTextBlock)
          myStackPanel.SetValue(Canvas.ZIndexProperty, no)
          MapLayer.SetPosition(myPin, New Location(CDbl(myLatitude), CDbl(myLongitude)))
          myMap.Children.Add(myPin)
          MapLayer.SetPosition(myStackPanel, New Location(CDbl(myLatitude), CDbl(myLongitude)))
          myMap.Children.Add(myStackPanel)
          AddHandlermyPin.Tapped, Sub()
                                     myStackPanel.Visibility = Xaml.Visibility.Visible
                                End Sub
          AddHandlermyStackPanel.Tapped, Sub()
                                          myStackPanel.Visibility = Xaml.Visibility.Collapsed
              
                                      End Sub
        Next
      Else
        Dim myMessage As New MessageDialog("該当データがありません。入力しなおしてください。")
  
        Await myMessage.ShowAsync
        myMap.ZoomLevel = 1
      End If
    Else
      Exit Sub
    End If
  End Sub
End Class
地図の拡大縮小、表示モードの変更等はBing Mapsで自動的に処理されるため、コードを書く必要はありません。
今回はここまでです。ありがとうございました。
筆者からのお知らせ
筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。
- 土地の公示価格を調べるプログラム
 
  
 
 










