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