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.






    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

    Postar um comentário

    Postagens mais visitadas deste blog

    E Esse Tal de Nano Service?

    Executar Audio em Java Swing

    Validando Email em Java Com e Sem expressão Regular