10月 182013
 

Accessでは住所取得用の郵便番号コントロールがあるのに、
VB.NETではありません。

自前で住所マスタを作成し表示することは可能ですが、
その場合マスタメンテナンスが必要で面倒…

というわけで、GoogleAPIのジオコーディングを使用し、
取得したXMLから住所情報を取得するコードを作成しました。

まずはどのようなXMLが取得できるか実験↓
http://maps.google.com/maps/api/geocode/xml?address=100-0005&language=ja&sensor=false

以下イメージのような結果が取得できます。
※サンプルとして、パラメータ値に郵便番号「100-0005」、日本語表示するようにします
xml_zipcode

XML内にある<address_component>の<long_name>が住所取得に使えそうです。
あとは、VB.NETのプログラムにてHTTPリクエストを発行し、必要な個所を抜き出して整形します。


    ''' <summary>
    ''' 住所検索(Googleジオコーディング参照)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnAddressZipCode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddressZipCode.Click

        Me.txtAddress.Text = String.Empty

        Dim url As String
        url = "http://maps.google.com/maps/api/geocode/xml?address="
        url &= HttpUtility.UrlEncode(Me.txtZipCode.Text)
        url &= "&language=ja&sensor=false"

        Dim uriRequest As New Uri(url)
        Dim geoRequest As HttpWebRequest = WebRequest.Create(uriRequest)
        Dim geoResponse As HttpWebResponse = geoRequest.GetResponse()
        Dim sr As New StreamReader(geoResponse.GetResponseStream())
        Dim geoXml As New XmlDocument()

        geoXml.LoadXml(sr.ReadToEnd().ToString())

        Dim addressArray As XmlElement = geoXml.Item("GeocodeResponse").Item("result")
        If Not addressArray Is Nothing Then
            Dim aryAddress As New ArrayList
            For Each x As XmlElement In addressArray
                If x.Name = "address_component" Then
                    If x.Item("long_name").InnerText.IndexOf("-") > 0 Then
                        Me.txtZipCode.Text = Replace(x.Item("long_name").InnerText, "-", "")  '正式な郵便番号を設定
                        Continue For
                    End If
                    If x.Item("long_name").InnerText.IndexOf("日本") > -1 Then
                        Continue For
                    End If
                    aryAddress.Add(x.Item("long_name").InnerText)   '住所情報を追加
                    Debug.WriteLine(x.Item("long_name").InnerText)
                End If
            Next
            aryAddress.Reverse()    '並び要素を逆転(県市町)
            Me.txtAddress.Text = String.Join("", aryAddress.ToArray(GetType(String)))
        End If

        addressArray = Nothing
        geoXml = Nothing
        sr.Close()
        uriRequest = Nothing

    End Sub

  One Response

  1.  

    大変参考になりました。(^^)/

 コメント入力欄

スパム対策で日本語が含まれない投稿は無視されます。何卒ご承知おき下さい。