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(); } }
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.
Ola parabés pelo post, fiz o seu exemplo e da o seguinte retorno:
ResponderExcluirmetodo 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?
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!
ExcluirBruno 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.
ResponderExcluirOlá 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