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("−", "−") End If End Using End Using Catch ex As Exception Throw End Try Return ret End Function #End Region End Class