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と入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。
土地の公示価格を調べるプログラム



