você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Distâncias entre cidades brasileiras

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.

Download do codigo

_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_


Veja a relação completa dos artigos de Airton Carrara