Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile
Visite também: Ipok ·  Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Lan University

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

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

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 2.97/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (1776 votos)

Opinião dos Leitores

Robson Lopes
17 Abr 2014, 12:05
Bom dia pessoal.
Aguem conseguiu montar um arquivo com a distancia de todas as cidades do Brasil.
Se cosneguiram, pode enviar?

Obrigado.
Dennis
09 Jul 2011, 19:41
Olá Airton,
Estou necessitando exatamente o que o seu "robô" se propõe a fazer.
Sou iniciante em java e me deparei com dois problemas no código:
Primeiro - não encontrei a descrição do "package br.unitau;"
Segundo - ao executar o código, recebo a seguinte mensagem:
"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -52"
Não encontrei erros na digitação do código, o que pode ser?
Obrigado.
Alessandro Donizete de Souza
14 Mar 2011, 21:15
Eu gostaria de saber , a distâcia entre Piracanjuba GO e Nova Londrina PR em KM ,aguardo resposta desde jà meus agradescimento...
FranciscoLima
27 Dez 2010, 18:50
E aí, sr. Airton. Já faz alguns dias que um pensamento estava batendo na minha cabeça, como será que está o pessoal de Taubaté, a tanto tempo não os vejo. Você, o Alexandre, o Iderson, o Carlinhos... Pois é... uma pesquisa no Google e te encontro aqui no Dicas-L, que coisa hein? Eu que comecei a usar Linux em 2003 graças aos comentários que você fazia lá pelos anos de 1995 na EletroPaulo, quando eu ficava olhando seus códigos em Clipper, como quem vê outro idioma. Parabéns pela Dica.
Abraços!
FranciscoLima
http://linuxnomicro.blogspot.com
Sérgio Douglas
20 Dez 2010, 15:27
Melhor usar a URL http://maps.google.com.br/maps/nav?output=htm&doflg=ptj&dirflg=d&hl=pt-BR&mapclient=html&q=from%3AGoi%E2nia-GO%20to%3AS%E3o%20Paulo-SP e modificar o programa para efetuar os "parse" destes dados.
Alexandre
02 Ago 2010, 19:05
Airton,

boa noite.

Parabéns pela aplicação. Coloquei seu código para rodar e não estou tendo a distância como retorno, apenas as cidades, o código sofreu alguma modificação?

Grato, e no aguardo de notícias.
Gilmar
13 Jul 2010, 18:31
Boa tarde,

Estou desenvolvendo um trabalho para otimizar a logistica de uma empresa e preciso das distancias entre todas as cidades do Brasil no excel ou em texto.
Vc tem essas informações?

Obrigado
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script
3ª geração do Under Servidor Cloud

Mobcamp 2014



 

Aprenda a Programar A Arte de Ensinar o Computador