terça-feira, 19 de junho de 2012

Carregando Google Maps em Java Swing


E ai galerinha! Estamos aqui mais uma vez para dar uma excelente dica à todos que trabalham com java desktop. Muito por ai se fala que não há como executar algumas coisas em swing pois existem limitações como por exemplo:

-Carregar arquivos flash;
-Executar Audio;
-Video;
-Conexão com sites com retornos complexos como google maps.

Bem, sobre este ultimo, venho mostrar que como todo Brasileiro, há sempre aquele jeitinho de contornar as situações difíceis, e com isso, vamos utilizar o nosso caro Json, Swingx etc....

Primeiramente vamos precisar das seguintes bibliotecas:

-httpclient :
 http://repo1.maven.org/maven2/commons-httpclient/commons-httpclient/3.0.1/commons-httpclient-3.0.1.jar
-Json :
http://wave-robot-java-client.googlecode.com/files/json.jar
-commons-codec:
http://commons.apache.org/codec/

Após efetuar o download, vamos criar uma classe chamada AcessaWebService. Como o nome diz, ela fará uma consulta a um web service que mostrará o retorno de uma url e a mesma será tratada para que possamos armazenar as coordenadas necessárias para efetuar alguma ação com o json, que no nosso caso é mostrar a posição do mapa a partir dela . Com estas coordenadas em mãos, você efetua a ação que quizer, veja nosso código abaixo:








  • package mapa.stream.WebService;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import javax.swing.JOptionPane;
    
    import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.params.HttpMethodParams;
    
    /**
     *
     * @author Bruno Santos
     */
    public class AcessaWebService {
    
        private static String rua = JOptionPane.showInputDialog("Digite a rua");
        private static String cidade = JOptionPane.showInputDialog("Digite a cidade");
        private static String estado = JOptionPane.showInputDialog("Digite o estado");
        private static String url;
        public static String lat;
        public static String lng;
    
        public static void main(String[] args) {
    
            String formataEndereco = rua.replaceAll(" ", "+");
            String formataEnderecoDois = "+" + cidade + ",+" + estado;
    
    
            url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + formataEndereco + "," + formataEnderecoDois + "&sensor=true";
            System.out.println(url);
            // Ciando a Instancia.  
            HttpClient client = new HttpClient();
    
            // criando método.  
            GetMethod method = new GetMethod(url);
    
            // entrada necessaria  
            method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                    new DefaultHttpMethodRetryHandler(3, false));
    
            try {
                // executa o metodo.  
                int statusCode = client.executeMethod(method);
    
                if (statusCode != HttpStatus.SC_OK) {
                    System.err.println("metodo fudeu!: " + method.getStatusLine());
                }
    
                // lendo a resposta. 
    
                String pagina = method.getResponseBodyAsString();
                System.out.println(pagina);
    
                String separado[] = pagina.split("[{-}]");
    
                System.out.println(separado[18]);
                if (separado[18].contains("\"[A-Z]")) {
                    String finalizado[] = separado[17].split(",");
                    if (separado[17].contains("\"[A-Z]")) {
                        finalizado = separado[16].split(",");
    
                        lat = finalizado[0].replaceAll("[^0-9---.]", "");
                        lng = finalizado[1].replaceAll("[^0-9---.]", "");
                        System.out.println(lat);
                        System.out.println(lng);
                    } else {
    
                        lat = finalizado[0].replaceAll("[^0-9---.]", "");
                        lng = finalizado[1].replaceAll("[^0-9---.]", "");
                        System.out.println(lat);
                        System.out.println(lng);
    
                    }
    
                } else if (separado[18].contains(",")) {
                    String finalizado[] = separado[18].split(",");
    
                    lat = finalizado[0].replaceAll("[^0-9---.]", "");
                    lng = finalizado[1].replaceAll("[^0-9---.]", "");
                    System.out.println(lat);
                    System.out.println(lng);
                } else {
                    String finalizado[] = separado[19].split(",");
    
                    lat = finalizado[0].replaceAll("[^0-9---.]", "");
                    lng = finalizado[1].replaceAll("[^0-9---.]", "");
                    System.out.println(lat);
                    System.out.println(lng);
                }
    
    
            } catch (HttpException e) {
                System.err.println("Violação fatal do protocolo: " + e.getMessage());
                e.printStackTrace();
            } catch (IOException e) {
                System.err.println("Violação fatal transmissão: " + e.getMessage());
                e.printStackTrace();
            } finally {
                // Release the connection.  
                method.releaseConnection();
            }
        }
    
  • O Resultado deverá ser parecido com este ao executar:





  • A resposta será semelhante à esta:

    {
       "results" : [
          {
             "address_components" : [
                {
                   "long_name" : "Belém",
                   "short_name" : "Belém",
                   "types" : [ "locality", "political" ]
                },
                {
                   "long_name" : "Para",
                   "short_name" : "PA",
                   "types" : [ "administrative_area_level_1", "political" ]
                },
                {
                   "long_name" : "Brazil",
                   "short_name" : "BR",
                   "types" : [ "country", "political" ]
                }
             ],
             "formatted_address" : "Belém - Pará, Brazil",
             "geometry" : {
                "bounds" : {
                   "northeast" : {
                      "lat" : -1.04888110,
                      "lng" : -48.29863190
                   },
                   "southwest" : {
                      "lat" : -1.5264540,
                      "lng" : -48.56579360
                   }
                },
                "location" : {
                   "lat" : -1.45502050,
                   "lng" : -48.50236820
                },
                "location_type" : "APPROXIMATE",
                "viewport" : {
                   "northeast" : {
                      "lat" : -1.27654350,
                      "lng" : -48.24624940
                   },
                   "southwest" : {
                      "lat" : -1.63348340,
                      "lng" : -48.7584870
                   }
                }
             },
             "types" : [ "locality", "political" ]
          }
       ],
       "status" : "OK"
    }


                   "northeast" : 
    -1.27654350
    -48.24624940


    Sendo as 2 ultima linhas em vermelho as coordenadas que nos interessam já formatadas nas variáveis lat e lng.

    Este exemplo nos mostra como utilizar o json solicitando uma url.

    Espero que este exemplo tenha sido útil. Até breve.

    Abraços. 
    Bruno Rafael Santos.






    4 comentários:

    1. Ola parabés pelo post, fiz o seu exemplo e da o seguinte retorno:
      metodo fudeu!: HTTP/1.0 400 Bad Request
      Error 400 (Bad Request)!!1


      no entanto quando coloco a url juntamente com os parametros direto no browser ele encontra o endereço.
      Poderia dar uma força?

      ResponderExcluir
      Respostas
      1. Olá Aurélio, primeiramente obrigado pela visita. Fiz o teste aqui e funcionou perfeitamente, mas quando cortei minha conexão com a internet ocorreu o mesmo erro. Verifique sua conexão com a internet, ou veja se não esta ocorrendo nenhum erro de acesso da sua aplicação com a conexão à net. Abraços!

        Excluir
    2. Bruno Rafael Santos li o post mais não testei o código e tenho uma dúvida, é possível abrir o mapa como se você na página web dentro do Java Swing tendo opções de controle de zoom e movimento? Até onde pesquisei não achei essa forma.

      ResponderExcluir
    3. Olá Ivan, sim é possível, eu mesmo fiz desta forma em uma aplicação minha, mas o detalhe é você vai precisar implementar tudo na mão... att.

      ResponderExcluir

    Admin: Bruno

    Olá Galera! muito grato por estarem acessando nosso blog. Espero que seja possível transmitir de forma compreensível um pouco de meus conhecimentos em programação, para esta comunidade de desenvolvedores que cresce cada vez mais! Espero que Gostem! Abraço! E meu enorme obrigado à Renato Simões, Átila Soares,Wanderson Quinto, Emerson e a toda galera que sempre ajudou meu sincero obrigado....
    Especialmente a Natalia Failache e Rita de Cassia que sempre apoiaram este sonho....

    De seu amigo Bruno Rafael.