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.


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_

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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