.NET

6 jan, 2017

VB .NET – Usando o Google Maps com o WebBrowser

Publicidade

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:

vbn_maps3

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: Visual Studio 2015 Community

Criando o projeto no VS Community 2015

Abra o VS Community 2015 e clique em New Project e 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:

  • 6 Labels
  • 6 TextBox : txtRua, txtCidade, txtEstado, txtCep, txtLatitude e txtLongitude
  • 2 Button – btnMapaEndereco, btnMapaCoordenadas
  • 1 WebBrowser – webb1

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

vbn_maps0

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ê obté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:

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

Pegue o projeto completo aqui: VB_Maps.zip