GAMBCODES

VB.NET – Cálculo de distância entre dois endereços via Google Maps API


Neste artigo irei demonstrar como pode ser feito o cálculo entre dois endereços utilizando o API do Google Maps, através da linguagem Visual Basic da plataforma .NET.

O API do Google Maps apresenta várias funcionalidades que são bastante úteis em aplicações, principalmente as comerciais! Por exemplo: imagine-se na situação em que é  necessário calcular a distância entre dois endereços para realizar um determinado serviço em um cliente, uma aplicação que faça este cálculo  seria muitíssimo interessante para possíveis planejamentos de deslocamentos!

SOFTWARES E APPS GRÁTIS!  CLIQUE AQUI PARA MAIS INFORMAÇÕES! 

dollar

 

 

Recursos Utilizados:

  • Microsoft Visual Studio 2008 Professional Edition ou similar;
  • API Google Maps;

Neste artigo subintendo que já tenha um prévio conhecimento na plataforma Visual Studio. Aja vista que ignorarei certos passos para não torná-lo demasiado longo.

Criando o Projeto

Clicando e New Project no Visual Studio, dê um nome apropriado para o projeto e finalize clicando em OK.

Controles1 Form (frmKM)

  • 8 Labels (lblIda, lblIdaKM, lblVolta, lblVoltaKM, lblKM, lblObs, lblOrigem, lblDestino);
  • 2 TextBoxs (txtIda, txtVolta);
  • 1 Button (btnCalcular);

 

Os organize da forma que achar melhor.

calculoDistanciaFrm

 

 

Rotinas

  • spuKmDistancia
  • spiCalcKM;
  • spiLImapaCampo;

A função spuKmDistancia busca através da API do Google Maps a distância entre dois endereços e retorna este valor. Importante notar que estamos trabalhando com os dados que a API nos passa; este resultado vem através de um arquivo XML e, portanto é necessário saber manipulá-lo para poder obter o resultado correto. Caso não saiba o que são arquivos XML faça uma busca rápida na Internet e encontrará inúmeros resultados, como exemplo: Aqui.

Veja este exemplo prático de uma busca entre São Paulo e Rio de Janeiro: http://maps.googleapis.com/maps/api/directions/xml?origin=saopaulo&destination=riodejaneiro&mode=driving&language=pt-BR&sensor=false. Onde:

  • origin: Endereço de origem;
  • destination: Endereço de destino;
  • mode: forma de locomoção: driving (carro), walking(a pé);
  • language: Linguagem;
  • sensor: para aplicações que usam GPS: true(verdadeiro), false(falso);

Nós necessitamos apenas do campo localizado em route/leg/distance/value.

expAPIGoogleMaps

Tipo de Status:

A API retorna diferentes status, assim deveremos tratá-los para o bom funcionamento da aplicação:

  • ZERO_RESULTS: Nenhum resulta para a busca;
  • NOT_FOUND: Endereço não encontrado;
  • INVALID_REQUEST: Requisição inválida;
  • MAX_ELEMENTS_EXCEEDED: Origem ou destino ultrapassaram o numero máximo de caracteres;
  • OVER_QUERY_LIMIT:  Aplicação excedeu o número máximo de requisições em um determinado período;
  • REQUEST_DENIED:  A aplicação bloqueou o uso do Distance Matrix;
  • UNKNOWN_ERROR: Erro desconhecido.
  • OK: Pesquisa realizada com sucesso.

java

APRENDA JAVA DE FORMA PRÁTICA E RÁPIDA! CÓDIGOS EXPLICADOS PASSO À PASSO!  

 

O campos status fica logo no início do documento:

expAPIGoogleMaps2

O uso da API tem suas limitações! Não pense você que poderá fazer milhares de consultas diárias! Para fins de consulta, acesse este link https://developers.google.com/maps/licensing?hl=pt-br para maiores esclarecimentos sobre a politica de licenciamento da API do Google Maps.

Enfim vamos ao código:

Public Shared Function spuKmDistace(ByVal strOrigem As String, ByVal strDestino As String) As Double
 
Dim dblKm As Double = 0
Dim strResultado As String = String.Empty
 
'VERIFICA SE OS CAMPOS DESTINO E ORIGEM SÃO IGUAIS
If String.Compare(strOrigem.Trim, strDestino.Trim, True) = 0 Then
MessageBox.Show("Endereço de origem igual ao o endereço de destino.", "STRING_EQUAL", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
End If
 
'SUBSTITUINDO ESPAÇOS POR %20
strOrigem = strOrigem.Replace(" ", "%20")
strDestino = strDestino.Replace(" ", "%20")
 
Try
 
'LENDO XML VIA URL...'CRIA UMA VARIÁVEL DO TIPO XELEMENT PARA PODER LER O DOCUMENTO XML
Dim xml As XElement = XElement.Load("http://maps.googleapis.com/maps/api/directions/xml?origin=" _
& strOrigem & "& destination=" & strDestino & "& mode=driving& language=pt-BR& sensor=false")
 
'VERIFICA SE O XML NÃO ESTÁ VAZIO
If (Not xml Is Nothing) Then
 
'OBTEM O VALOS DO STATUS
strResultado = xml.Element("status").Value
 
'TRATA OS STATUS
Select Case strResultado
 
Case "ZERO_RESULTS"
MessageBox.Show("O calculo não pode ser realizado. Endereço não localizado", _
"ZERO_RESULTS", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "NOT_FOUND"
MessageBox.Show("O calculo não pode ser realizado. Endereço não localizado", _
"NOT_FOUND", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "INVALID_REQUEST"
MessageBox.Show("O calculo não pode ser realizado. Requisição inválida", _
"INVALID_REQUEST", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "MAX_ELEMENTS_EXCEEDED"
MessageBox.Show("O calculo não pode ser realizado. Origem ou destino ultrapassaram o numero máximo de caracteres.", _
"MAX_ELEMENTS_EXCEEDED", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "OVER_QUERY_LIMIT"
MessageBox.Show("O calculo não pode ser realizado. Aplicação excedeu o número máximo de requisições em um determinado período.", _
"OVER_QUERY_LIMIT", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "REQUEST_DENIED"
MessageBox.Show("O calculo não pode ser realizado. A aplicação bloqueou o uso do Distance Matrix", _
"REQUEST_DENIED", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
Case "UNKNOWN_ERROR"
MessageBox.Show("O calculo não pode ser realizado. Erro desconhecido. Tente novamente.", _
"UNKNOWN_ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return -1
 
'RETOR O RESULTA DA DISTÂNCIA ENTRE OS DOIS ENDEREÇOS
Case "OK"
Return CDbl(xml.Element("route").Element("leg").Element("distance").Element("value").Value) / 1000
 
End Select
End If
 
Catch ex As Exception
Throw New Exception("Falha ao calcular distância." & ex.Message)
End Try
 
'RETORNA -1 EM CASO EM ERRO NA PESQUISA
Return -1
End Function

A Sub spiCalcKm pega valor o retornado da função spuKmDistace e a utiliza para alimentar os componentes do formulário.

Private Sub spiCalcKM()
 
Dim dblIdaKM As Double = 0
Dim dblVoltaKM As Double = 0
Dim dblTotalKM As Double = 0
Dim intTamanhoFonte As Single = 0
 
dblIdaKM = spuKmDistace(txtOrigem.Text, txtDestino.Text)
 
If dblIdaKM = -1 Then
spiLimpaCampo()
Exit Sub
Else
lblIdaKM.Text = CStr(dblIdaKM) & " KM"
End If
 
dblVoltaKM = spuKmDistace(txtDestino.Text, txtOrigem.Text)
 
If dblVoltaKM = -1 Then
spiLimpaCampo()
Exit Sub
Else
lblVoltaKM.Text = CStr(dblVoltaKM) & " KM"
End If
 
dblTotalKM = dblIdaKM + dblVoltaKM
lblKM.Text = CStr(dblTotalKM) & " KM"
 
If lblKM.Text.Length > 8 Then
intTamanhoFonte = 30 – lblKM.Text.Length
Else
intTamanhoFonte = 36
End If
 
lblKM.Font = New Font(lblKM.Font.Name, intTamanhoFonte)
End Sub

Finalmente a Sub spiLimpaCampo  limpa os campos do formulário:

Private Sub spiLimpaCampo()
lblKM.Text = "0 KM"
lblIdaKM.Text = "0 KM"
lblVoltaKM.Text = "0 KM"
txtOrigem.Text = String.Empty
txtDestino.Text = String.Empty
End Sub

Finalizando: chame a função spiCalcKM() no evento click do botão btnCalcular e a função spiLimpaCampo() no evento FormClosing do formulário. E pronto você poderá realizar cálculos de distâncias ultilizando a API do Google Maps! Fácil não?



CURSO PRÁTICO DE PROGRAMAÇÃO EM JAVA APROVADO PELOS EDITORES DO SITE GAMBCODES.COM: ACESSE AGORA! CLIQUE AQUI.

Comments

comments

Categories:   VB.NET

Tags:  , , , ,

Comments