Google Map を使って住所を正規化する(その3)

昨日・一昨日のエントリでは二日続けて「Google Map を使って住所を正規化する」記事を書きましたが、現在携わってるプロジェクトのある画面で DOM を使うと、地図コントロール(ActiveX) がなぜか正常動作しなくなります。


関連記事Google Map を使って住所を正規化する
関連記事Google Map を使って住所を正規化する(その2)


当初 Application.DoEvents を疑って昨日の WebBrowser を使わないバージョンにしたものの、それでも正常動作しません。結局 WebRequest を使い、ベタで解析するようにしたらうまく行きました。DOM がどう ActiveX に干渉してるのか、中身がブラックボックスなだけになんとも判りません。

Option Explicit On
Option Strict On

Imports System.Net
Imports System.IO
Imports System.Text

''' <summary>
''' 住所の検証を行う機能を提供するクラスです。
''' </summary>
Public NotInheritable Class GoogleAddressValidator

#Region "コンストラクタ"
    ''' <summary>
    ''' 隠蔽されたコンストラクタ
    ''' </summary>
    Private Sub New()
    End Sub
#End Region

#Region "メソッド"

    ''' <summary>
    ''' 正規化された住所を取得します。
    ''' </summary>
    ''' <remarks>
    ''' WebBrowser や DOM 使うと MapRoute が正常動作しなくなるため、WebRequest で取得しベタに解析する
    ''' </remarks>
    Public Shared Function GetPlaceName(address As String) As String
        Dim ret = ""
        If (String.IsNullOrEmpty(address)) Then Return ret
        Try
            Dim enc = System.Text.Encoding.GetEncoding("Shift_JIS")
            Dim req = WebRequest.Create("http://maps.google.co.jp/maps?hl=ja&q=" + address)
            Using res = req.GetResponse(), st = res.GetResponseStream()
                Using sr = New StreamReader(st, enc)

                    ' 直接 String に代入するより、いったん StringBuilder で受けた方が速い
                    Dim buf = New StringBuilder(sr.ReadToEnd())
                    Dim html = buf.ToString()
                    Dim index = html.IndexOf("id=""link_A_1""")
                    If (index > -1) Then
                        html = html.Substring(index, 1024)
                        index = InStr(html, "<span>") + 5
                        html = html.Substring(index)
                        index = InStr(html, "</span>") - 1
                        ret = html.Replace(html.Substring(index), "").Replace("&#8722;", "&#8722;")
                    End If

                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
        Return ret
    End Function

#End Region

End Class