VB .NET  - Usando o Google Maps com o WebBrowser (revisão)


 Neste artigo vou recordar como usar o Google Maps em aplicações VB .NET interagindo como controle WebBrowser.

No exemplo do artigo vamos exibir um mapa a partir de um endereço informado e também a partir da longitude e latitude informada.

Para exibir o mapa não vamos precisar usar qualquer licença do Google, nem invocar alguma API para obter o resultado.

Vamos apenas usar a url de consulta do Google : "http://maps.google.com/maps?q=" e exibir o resultado no controle WebBrowser.

Fazendo isso ao executar o projeto iremos obter uma mensagem indicando que o Navegador é incompatível e não pode ser usado:

Isso ocorre por que o controle WebBrowser  por padrão emula o Internet Explorer 7, que é um navegador muito antigo para suportar o Google Maps.

Então temos que forçar o WebBrowser a emular outra versão do IE mas isso só pode ser feito via alteração do registro do sistema.

Na verdade a configuração que se deve alterar no registro depende do programa que você está executando e a alteração tem que ser feita apenas para este programa.

Para contornar o problema criamos uma rotina que verifica a versão instalada e faz a alteração no registro do sistema.

Recursos usados :

Criando o projeto no VS Community 2015

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application

Informe o nome VBNET_Tasks e clique no botão OK;

No formulário form1.vb inclua os seguintes controles:

Disponha os controles no formulário conforme o leiaute da figura abaixo:



A seguir no evento Click do botão de comando : Mapa/Endereço - inclua o código abaixo:

 Private Sub btnMapaEndereco_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnMapaEndereco.Click
        If VerificaNavegador() Then
            Try
                Dim rua As String = String.Empty
                Dim cidade As String = String.Empty
                Dim estado As String = String.Empty
                Dim cep As String = String.Empty
                Dim consultaEndereco As New StringBuilder()
                consultaEndereco.Append("http://maps.google.com/maps?q=")
                ' monta a rua como parte da consulta
                If txtRua.Text <> String.Empty Then
                    rua = txtRua.Text.Replace(" ", "+")
                    consultaEndereco.Append(rua + "," & "+")
                End If
                ' monta a cidade como parte da consulta
                If txtCidade.Text <> String.Empty Then
                    cidade = txtCidade.Text.Replace(" ", "+")
                    consultaEndereco.Append(cidade + "," & "+")
                End If
                ' monta o estado como parte da consulta
                If txtEstado.Text <> String.Empty Then
                    estado = txtEstado.Text.Replace(" ", "+")
                    consultaEndereco.Append(estado + "," & "+")
                End If
                ' monta o cep como parte da consulta
                If txtCep.Text <> String.Empty Then
                    cep = txtCep.Text.ToString()
                    consultaEndereco.Append(cep)
                End If
                ' passa a url com a query string para o controle webbrowser
                webb1.Navigate(consultaEndereco.ToString())
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString(), "Não foi possível obter o Mapa")
            End Try
        Else
            MessageBox.Show("O Naveador usado é Incompatível", "Aviso")
        End If
    End Sub

Neste código estamos chamando a rotina VerificarNavegador() que irá verificar a versão do IE instalado e irá fazer a alteração no registro para que o WebBrowser possa renderizar as informações com a versão atualizada.

A seguir no evento Click do botão de comando - Mapa - Coordenadas - inclua o código abaixo:

 Private Sub btnMapaCoordenadas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnMapaCoordenadas.Click
        If VerificaNavegador() Then
            If txtLatitude.Text = String.Empty Or txtLongitude.Text = String.Empty Then
                MessageBox.Show("Forneça os valores para a latitude e a longitude.", "Dados inválidos")
            End If
            Try
                Dim lat As String = String.Empty
                Dim lon As String = String.Empty
                Dim consultaEndereco As New StringBuilder()
                consultaEndereco.Append("http://maps.google.com/maps?q=")
                ' toma a latitude como parte da consulta
                If txtLatitude.Text <> String.Empty Then
                    lat = txtLatitude.Text
                    consultaEndereco.Append(lat + "%2C")
                End If
                ' toma a longitude como parte da consulta
                If txtLongitude.Text <> String.Empty Then
                    lon = txtLongitude.Text
                    consultaEndereco.Append(lon)
                End If
                webb1.Navigate(consultaEndereco.ToString())
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString(), "Error")
            End Try
        Else
            MessageBox.Show("O Naveador usado é Incompatível", "Aviso")
        End If
    End Sub

 

Agora vamos definir o código do método VerificaNavegador() que obtém a versão do IE instalada e verifica o registro

    Private Function VerificaNavegador() As Boolean
        Dim versaoNavegador As Integer, RegVal As Integer
        Try
            ' obtem a versão instalada do IE
            Using Wb As New WebBrowser()
                versaoNavegador = Wb.Version.Major
            End Using

            ' define a versão do IE
            If versaoNavegador >= 11 Then
                RegVal = 11001
            ElseIf versaoNavegador = 10 Then
                RegVal = 10001
            ElseIf versaoNavegador = 9 Then
                RegVal = 9999
            ElseIf versaoNavegador = 8 Then
                RegVal = 8888
            Else
                RegVal = 7000
            End If

            ' define a chave atual
            Dim Key As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", True)
            Key.SetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe", RegVal, RegistryValueKind.DWord)

            Key.Close()
            Return True

        Catch ex As Exception
            Return False
        End Try
    End Function

Como o aplicativo é baseado inteiramente no Google Maps, como um bônus adicional, o site do Google Maps fornece todos os controles de manipulação de visualização necessários para navegar no mapa.

Assim, sem esforço adicional, você obém recursos como zoom, mapas de tráfego, mapas de ruas, imagens de varredura e mapas híbridos. Podemos também obter um mapa de visão geral, a capacidade de imprimir o mapa, e-mail, ou link para ele sem custo adicional.

Também é possível remover a interface e alimentar endereços específicos ou coordenadas diretamente para o código equivalente e acessar mapas específicos diretamente através de um controle de navegador da web.

Executando o projeto iremos obter o seguinte resultado:

Exibindo o mapa usando a latitude e longitude
Exibindo o mapa usando o endereço

Pegue o projeto completo aqui :  VB_Maps.zip

Ninguém pode servir a dois senhores; porque ou há de odiar um e amar o outro, ou se dedicará a um e desprezará o outro. Não podeis servir a Deus e a Mamom.
Mateus 6:24

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti