No post anterior apresentamos a utilização do Google Maps através de sua API para exibição de uma marca sobre localidade e exibição de rota entre dois pontos no mapa. Para tal, inserimos alguns scripts (Javascript) em páginas web.

Uma questão interessante que surge é como calcular a distância e o tempo de viagem entre duas localidades de uma rota. Os resultados poderão, então, serem utilizados em sistemas específicos. A solução apresentada foi utilizar o Google Maps para traçar a rota e, então, fazer um data scraping ou raspagem de dados para extrair as informações do HTML gerado pelo Google Maps. Como já foi mencionado, o processo consiste em receber os tags HTML em uma variável string e procurar nessa string a informação desejada; no caso, a distância e o tempo de viagem da rota informada.

Para exemplificar e melhorar a compreensão do processo decidimos construir uma aplicação que realize o cálculo de distância e tempo de viagem entre cidades e municípios brasileiros. A solução consiste de um banco de dados com cadastro de estados e cidades brasileiras. O usuário seleciona a cidade origem e destino para que o programa possa, após alguns segundos, exibir a distância e o tempo de viagem entre as cidades selecionadas. O tempo total é calculado a partir de uma viagem de carro respeitando os limites de velocidade de cada trecho. A cada cálculo realizado o sistema armazena em um banco de dados os valores encontrados para que, nas próximas solicitações do mesmo trajeto a resposta seja imediata; sem a necessidade de recálculo.

Na realidade, nenhum cálculo é feito. O sistema faz apenas uma leitura das informações contidas na página web do Google Maps que contém os dados desejados. Por isso o sistema precisa estar sendo executado em computador conectado a internet. O algoritmo utilizado é, mais ou menos, o seguinte:

1) string origem = ‘nome_da_cidade_e_estado_origem';
2) string destino = ‘nome_da_cidade_e_estado_destino';
3) string url = string.Format(“http://maps.google.com.br/maps?saddr={0}&daddr={1}&z=1″, origem, destino); // URL de pesquisa no Google Maps
4) Verificar se já existe no banco de dados a distância e o tempo de viagem entre as cidades origem e destino. Se já tiver, vai para linha 11. Se não, continua na linha 5
5)  string textoUrl = HtmlPage.Read(url); // Faz a leitura do HTML da url e guarda em uma string
6)  Regex RegexObj = new Regex(“distance:'(?<VALOR>.*?)'”); // Criam uma expressão regular para localização do valor da distância na página
7) string distancia = RegexObj.Match(textoUrl).Groups[“VALOR”].Value; // Efetua o casamento e extrai o valor correspondente a distância
8 ) RegexObj = new Regex(“time:'(?<VALOR>.*?)'”); // Cria uma expressão regular para localização do valor do tempo na página
9) string tempo = RegexObj.Match(textoUrl).Groups[“VALOR”].Value; // Efetua o casamento e extrai o valor correspondente ao tempo
10) Salva os resultados encontrados (distância e tempo) correspondente a cidade origem e destino no banco de dados;
11) Exibe os resultados encontrados (distância e tempo) para o usuário;
11) Fim;

Este é o algoritmo utilizado na aplicação que desenvolvi. Note que na primeira pesquisa o sistema resgata os dados do Google Maps e salva no banco de dados (linhas 5 a 10). Nas próximas vezes que uma pesquisa for feita com as mesmas cidades, o sistema resgata os resultados diretamente do banco de dados. Isso dará mas rapidez ao processo, uma vez que muito raramente a distância e o tempo irá ser modificado. O principal problema deste processo é que se a Google modificar o layout da página o algoritmo também terá que ser modificado para localizar novamente em que posição os valores poderão sem encontrados. Esse algoritmo funcionou bem até o momento da escrita deste post. Se houver alguma mudança me avisem que agente corrige a aplicação.

Para saber mais sobre a aplicação desenvolvida acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/distanciatempo-entre-cidades-brasileiras/ ou acesse meu site pessoal (http://www.reginaldojr.com/RotasGoogleMaps.aspx) para ver uma pequena adaptação do recurso.

About these ads