De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Airton Carrara
Data de Publicação: 01 de julho de 2009
Data de Publicação: 01 de July de 2009
Para uso em um sistema de cálculo de diárias, precisávamos da distância de nossa cidade (Taubaté-SP) para as demais cidades brasileiras.
O Google Maps fornece a distância, além da rota e o mapa.
A idéia foi programar um "robô" para fazer as milhares de pesquisas, obter o resultado e manipulá-lo para extrair somente a informção necessária.
Partimos de um arquivo previamente montado com as url's, o urls.txt. Algumas linhas deste arquivo como exemplo:
O arquivo acima foi montado a partir de uma base de dados dos Correios, com as cidades e seus estados.
Após processado pelo "robô", o arquivo resultante (distancias_de_taubate.txt) apresenta:
Acrelândia AC 3.500 Brasiléia AC 3.779 Capixaba AC 3.634
de fácil utilização em bancos de dados ou planilhas.
O "robô" é um programa em Java. Os arquivos acima estão(rão) no diretório C:\. Altere como desejar...
Em nossas instalações, obtivemos os dados em 5 horas de processamento.
_INICIO DO PROGRAMA Distancias.java_
/**
* Distancias.java
*
* @version 1.0 - 06/05/2009
*
* Obtém as distâncias, em km, de Taubaté às demais cidades do Brasil.
* Fonte: http://maps.google.com
*
* Entrada: c://urls.txt - arquivos com as urls das cidades - 1 por linha
* Saída: c://distancias_de_taubate.txt
*
*/
package br.unitau;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
*
* @author Airton Carrara
*
*/
public class Distancias extends JFrame{
private static final long serialVersionUID = 1L;
String status = "Montando a lista...";
/**
*
* @throws MalformedURLException
*/
public Distancias() throws MalformedURLException {
super("Descobrindo distâncias de Taubaté");
setLocationRelativeTo(null);
setSize(400,200);
setVisible(true);
ArrayList< String> urlArray = new ArrayList< String>();
System.out.print("Montando a lista de cidades... ");
long inicio = System.currentTimeMillis();
try {
BufferedReader brArrayList = new BufferedReader(new FileReader("c://urls.txt"));
String str;
while((str = brArrayList.readLine()) != null){
urlArray.add(str);
}
brArrayList.close();
}
catch (IOException e){
JOptionPane.showMessageDialog(null, e.toString(),"Erro!",JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
return;
}
System.out.println("ok em " + String.valueOf(System.currentTimeMillis()-inicio) + " ms.\n");
URL url = null;
long start = System.currentTimeMillis();
for (int i=0; i < urlArray.size(); i++){
url = new URL(urlArray.get(i));
String cidade0 = url.toString().substring(71);
String cidade = cidade0.substring(0, cidade0.indexOf("+-"));
cidade = cidade.replace("+", " ");
String uf0 = url.toString().substring(url.toString().length()-11);
String uf = uf0.substring(0, 2);
obtemConteudo(url, i+1, urlArray.size(), cidade, uf);
}
long elapsedTimeMillis = System.currentTimeMillis()-start;
System.out.println("Tempo em ms decorrido: " + elapsedTimeMillis);
System.exit(DISPOSE_ON_CLOSE);
}
public void paint (Graphics g){
super.paint(g);
g.setFont(new Font("SansSerif", Font.BOLD, 16));
g.setColor(Color.blue);
g.drawString(status, 50, 100);
}
/**
* Método para obtenção e tratamento do conteúdo da url,
* a ser gravado em arquivo.
*
* @param url
* @param i
* @param total
* @param cidade
* @param uf
*/
private void obtemConteudo(URL url, int i, int total, String cidade, String uf){
try {
StringBuffer sb = new StringBuffer();
BufferedReader brURL = new BufferedReader(new InputStreamReader(url.openStream()));
String str;
while ((str = brURL.readLine()) != null) {
sb.append(str);
}
brURL.close();
int onde = sb.indexOf("< div class=dditd id=dditd>< div>< b>");
String str_onde = "";
String km = "";
if (onde > 0){
str_onde = sb.substring(onde+34, onde+34+15);
int finao = str_onde.indexOf("&#");
km = str_onde.substring(0, finao);
}
System.out.println(i + " de " + total + " ::: " + cidade + " - " + uf + " - " + km + " km");
status = i + " de " + total + " ::: " + cidade + " - " + uf + " - " + km + " km";
repaint();
grava(cidade, uf, km);
sb.setLength(0);
} catch (MalformedURLException e) {
JOptionPane.showMessageDialog(null, e.toString(),"Erro!",JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.toString(),"Erro!",JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
/**
* Método para gravação no arquivo de saída c://distancias_de_taubate.txt
*
* @param cidade
* @param uf
* @param str_final
*/
private void grava(String cidade, String uf, String str_final){
try {
File saida = new File("c://distancias_de_taubate.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(saida, true));
bw.write(cidade+"\t"+uf+"\t"+str_final);
bw.write("\n");
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Método principal
*
* @param args
* @throws MalformedURLException
*/
public static void main(String[] args) throws MalformedURLException {
Distancias dist = new Distancias();
dist.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
_FINAL DO PROGRAMA Distancias.java_