VB .NET - Localizando o CEP a partir de um endereço com a API do Google
Neste artigo vou mostrar como podemos obter o CEP de um endereço usando a API do Google em uma aplicação Windows Forms usando a linguagem VB .NET. |
Hoje vamos usar a API do Google para obter a informação do CEP a partir de um endereço em uma aplicação VB .NET.
Atualmente podemos obter praticamente qualquer tipo de informação na internet graças a evolução da tecnologia que disponibiliza diversas APIs ou web services oferecendo todo o tipo de informação.
Dentre essas APIS e serviços a API do Google se destaca pela sua versatilidade e abrangência. Veja nas referências os artigos já escritos sobre como usar a API do Google para diversos tipos de serviços.
No exemplo de hoje eu vou usar uma aplicação Windows Forms e o VB .NET para extrair a informação do CEP usando a API do Google. Para isso vou fazer o download das informações usando a classe WebClient.
A classe WebClient do namespace System.NET pode ser usada em uma aplicação VB para efetuar download e upload de arquivos na internet. Ela é uma alternativa a classe WebRequest que usamos para mostrar como fazer download via HTTP no artigo:
A classe WebClient fornece métodos para enviar dados ou receber dados de qualquer recurso identificado pela URI ; seja local , intranet ou internet.
Ela , na verdade , usa a classe WebRequest para fornecer acesso aos recursos da internet. Instâncias da classe WebClient podem acessar dados com qualquer WebRequest registrados com o método WebRequest.RegisterPrefix.
A plataforma .NET Framework suporta por padrão URIs que começam com : http , https e file:schema
A classe WebClient fornece quatro métodos para fazer o envio de arquivos para um recurso:
A classe WebClient fornece três métodos para fazer o download de arquivos a partir de um recurso:
Nota: Para saber mais sobre os métodos clique no link para ir para o site da MSDN
Uma instância da classe WebClient não envia um cabeçalho HTTP opcional por padrão. Se sua requisição requerer um cabeçalho opcional , você precisa incluir o cabeçalho na coleção Headers.
Recursos usados:
Criando o projeto no Visual Studio 2013 Express
Abra o VS Express 2013 for Windows desktop e clique em New Project;
A seguir selecione a linguagem Visual Basic e o template Windows Forms Application;
Informe o nome CEP_Google_VBNET e clique no botão OK;
A seguir vamos incluir a partir da ToolBox os seguintes controles no formulário form1.vb do projeto:
Disponha os controles conforme o leiaute da figura abaixo:
A seguir vamos declarar os seguintes namespaces no formulário form1.vb:
Imports
System.NetImports
System.XmlImports
System.IO
No evento Click do botão - Obter CEP - inclua o código abaixo:
Private Sub btnGetCEP_Click(sender As Object, e As EventArgs) Handles btnGetCEP.Click
If String.IsNullOrEmpty(txtEndereco.Text) Then
MessageBox.Show("Informe o endereço")
Return
End If
If String.IsNullOrEmpty(txtCidade.Text) Then
MessageBox.Show("Informe a cidade")
Return
End If
If String.IsNullOrEmpty(cboUF.Text) Then
MessageBox.Show("Informe o estado")
Return
End If
txtCEP.Text = GetcodigoCEP(txtEndereco.Text, txtCidade.Text, cboUF.Text)
End Sub
|
O código acima esta validando as informações do endereço informadas pelo usuário. Elas serão usadas para chamar ao método GetCodigoCEP() e não são obrigatórias.
O código do método GetCodigoCEP() é dado abaixo:
Public Function GetcodigoCEP(ByVal address1 As String, ByVal city As String, ByVal state As String) As String
Dim enderecoXML As String = String.Empty
Dim codigoCEP As String = String.Empty
Try
'Cria um objeto do tipo web client
Dim wsClient As New WebClient()
'Constroi a URL concatenando os valores dos endereços
Dim codigoCEPurl As String = "?address={0},+{1},+{2}&sensor=false"
'Aqui na construção da URL , sensor é obrigatório e indica se a requisição vem de um dispositivo com localização por sensor
Dim url As String = "http://maps.googleapis.com/maps/api/geocode/xml" & codigoCEPurl
url = String.Format(url, address1.Replace(" ", "+"), city.Replace(" ", "+"), state.Replace(" ", "+"))
'Download os dados no formato XML como uma string
enderecoXML = wsClient.DownloadString(url)
'verifica se o status esta OK e inicia o processamento
If enderecoXML.Contains("OK") Then
'Verifica se a seção postal_code existe na string e continua
If enderecoXML.Contains("postal_code") Then
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(enderecoXML)
Dim m_nodelist As XmlNodeList
'Obtem a lista de todos os endereço dos nós address_companent nodes
m_nodelist = xmlDoc.SelectNodes("/GeocodeResponse/result/address_component")
'Para cada componente verifica a seção type para obter o cep
For Each m_node In m_nodelist
'Pega o valor do elemento zipLongName
Dim zipLongName = m_node.ChildNodes.Item(0).InnerText
'Pega o valor do elemento zipShortName
Dim zipShortName = m_node.ChildNodes.Item(1).InnerText
'Pega o valor do elemento tipo de cep
Dim zipType = m_node.ChildNodes.Item(2).InnerText
'Se o tipo do componente for postal_code ou postal_code_prefix pega o CEP como zipLongName
If zipType = "postal_code_prefix" Or zipType = "postal_code" Then
codigoCEP = zipLongName
End If
Next
End If
End If
Catch ex As WebException
MessageBox.Show(ex.Message)
End Try
Return codigoCEP
End Function
|
O código acima monta uma URL usando os dados do endereço informados e chama a API do Google para obter informações do endereço.
A seguir usamos a classe webClient para fazer o download das informações da API do GooGle no formato XML.
Para visualizar o XML ponha um breakpoint na linha onde estamos fazendo o download das informações na variável enderecoXML e escolha a forma como deseja visualizar as informações.
Abaixo temos um exemplo de um XML retornado pela API no formato texto com base em um endereço informado: (Av. Paulista, 1000 , São Paulo, SP)
<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>Paulista Avenue, 100 - Bela Vista, São Paulo - São Paulo, Brazil</formatted_address>
<address_component>
<long_name>100</long_name>
<short_name>100</short_name>
<type>street_number</type>
</address_component>
<address_component>
<long_name>Paulista Avenue</long_name>
<short_name>Paulista Avenue</short_name>
<type>route</type>
</address_component>
<address_component>
<long_name>Bela Vista</long_name>
<short_name>Bela Vista</short_name>
<type>neighborhood</type>
<type>political</type>
</address_component>
<address_component>
<long_name>São Paulo</long_name>
<short_name>São Paulo</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>São Paulo</long_name>
<short_name>São Paulo</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>São Paulo</long_name>
<short_name>SP</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Brazil</long_name>
<short_name>BR</short_name>
<type>country</type>
<type>political</type>
</address_component>
<address_component>
<long_name>01310</long_name>
<short_name>01310</short_name>
<type>postal_code_prefix</type>
<type>postal_code</type>
</address_component>
<geometry>
<location>
<lat>-23.5706704</lat>
<lng>-46.6449151</lng>
</location>
<location_type>RANGE_INTERPOLATED</location_type>
<viewport>
<southwest>
<lat>-23.5720257</lat>
<lng>-46.6462702</lng>
</southwest>
<northeast>
<lat>-23.5693277</lat>
<lng>-46.6435723</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>-23.5706830</lat>
<lng>-46.6449274</lng>
</southwest>
<northeast>
<lat>-23.5706704</lat>
<lng>-46.6449151</lng>
</northeast>
</bounds>
</geometry>
</result>
</GeocodeResponse>
|
Após obter o XML usamos os recursos do namespace System.XML para localizar a seção postal_code e extrair a informação do CEP.
Observe que dependendo do endereço informado o valor pode vir incompleto. Assim o endereço deve estar no formato correto.
No evento Load do formulário estamos carregando a combobox - cboUF, usando um arquivo texto que contém as siglas do estados:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim path As String = "C:\dados\estados.txt"
cboUF.Items.AddRange(File.ReadAllLines(path))
cboUF.SelectedIndex = 0
End Sub
|
No evento Click do botão Limpar temos o código abaixo que limpa todos os TextBox do formulário:
Private Sub btnLimpar_Click(sender As Object, e As EventArgs) Handles btnLimpar.Click
For Each ctl In Controls
If TypeOf ctl Is TextBox Then ctl.Text = ""
Next ctl
End Sub
|
Executando o projeto e informando um endereço completo obtemos o CEP conforme abaixo:
Pegue o projeto
completo aqui: CEP_Google_VBNET.zip
João 3:17 Porque Deus enviou o seu Filho ao mundo, não para que julgasse o mundo, mas para que o mundo fosse salvo por ele.
João 3:18 Quem crê nele não é julgado; mas quem não crê, já está julgado; porquanto não crê no nome do unigênito Filho de Deus.
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 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#