Rota no gmap (Google Maps)

Boa tarde pessoal

preciso da ajuda de vocês para o seguinte caso:

Tenha uma classe Cliente que cadastra dados básicos (nome, endereço, telefone, email, …) até ai tudo bem, esta funcionando normalmente. O que necessito fazer agora é vizualizar o endereço no google maps.

Ex. Clico em informações do cliente e todos os dados do cliente são carregados. Ao lado do dado endereço, tem link “ver no mapa” e ao clicar nesse link abrirá o mapa com a rota até a localização que está cadastrada em endereço.

Quando abro o mapa ele já sai em uma coordenada especifica, essa coordenada nunca mudará. Então, a partir dessa coordenada seja traçada uma rota até o destino, que no caso é o endereço do cliente que já foi cadastrado.

É possivel realizar essa operação?

Estou utilizando o componente p:gmap do PrimeFaces para mostrar o mapa e banco de dados myql 5.1

Obrigado

Você pode desmembrar a url de localização e colocar o endereço destino.

É só analizar:

Dê: Brasília, Distrito Federal, República Federativa do Brasil
Para: São Paulo - São Paulo, República Federativa do Brasil

Essa é a URL que realiza o caminho.

https://maps.google.com/maps?saddr=Brasília,+Distrito+Federal,+República+Federativa+do+Brasil&daddr=São+Paulo+-+São+Paulo,+República+Federativa+do+Brasil&hl=pt-BR&ie=UTF8&sll=-19.668605,-47.44882&sspn=12.538558,20.280762

Agora basta trocar os valores, sendo que um deles é fixo, que seria São Paulo … do Brasil, não haveria nem mesmo a necessidade do gmap, já que ele trabalha mais com eventos em cima do mapa, mais próximo de funções do google earth.

[quote=andre.froes]Você pode desmembrar a url de localização e colocar o endereço destino.

É só analizar:

Dê: Brasília, Distrito Federal, República Federativa do Brasil
Para: São Paulo - São Paulo, República Federativa do Brasil

Essa é a URL que realiza o caminho.

https://maps.google.com/maps?saddr=Brasília,+Distrito+Federal,+República+Federativa+do+Brasil&daddr=São+Paulo+-+São+Paulo,+República+Federativa+do+Brasil&hl=pt-BR&ie=UTF8&sll=-19.668605,-47.44882&sspn=12.538558,20.280762

Agora basta trocar os valores, sendo que um deles é fixo, que seria São Paulo … do Brasil, não haveria nem mesmo a necessidade do gmap, já que ele trabalha mais com eventos em cima do mapa, mais próximo de funções do google earth.[/quote]

Obrigado pela resposta andre.froes

Entendi, mas o campo “Dê” eu já tenho o campo “Para” eu gostaria de pegar a informação a partir do que já esta cadastrado no banco de dados. Como ficaria nesse caso?

Vamos ver de acordo com as coordenadas:

De: -15.793367,-47.882317
Para: -15.794065,-47.881214

maps.google.com/maps?saddr=-15.793367,-47.882317&daddr=-15.794065,-47.881214&hl=pt-BR

Reduzindo assim deu pra entender né? :lol: :lol:

[quote=andre.froes]Vamos ver de acordo com as coordenadas:

De: -15.793367,-47.882317
Para: -15.794065,-47.881214

maps.google.com/maps?saddr=-15.793367,-47.882317&daddr=-15.794065,-47.881214&hl=pt-BR

Reduzindo assim deu pra entender né? :lol: :lol: [/quote]

Está começando a clarear as coisas :smiley:

então poderia colocar a url no link “ver no mapa” e alterar apenas a parte do destino: &daddr=-15.794065,-47.881214&hl=pt-BR seria mais ou menos isso?

Uma outra pergunta, estou fazendo isso com JSF 2.0, iria ficar no destino algo como: “#{clienteBean.cliente.endereco}”, funciona assim??

Desculpe tantas perguntas e a dificuldade de entender, é que sou novo no java :oops:

se #{clienteBean.cliente.endereco} retornar uma String contendo as coordenadas, sim, porque a coordenada é composta de latitude (virgula) longitude. Sacou? :smiley:

Mas ai nesse caso ele só funcionaria pelas coordenadas e não pelo endereço certo? Aquele primeiro exemplo que você me passou buscava por endereço, se retornar o endereço naquele mesmo modelo que você passou não funciona tambem?

se estiver formatado com as regras do google e o local existir, sim funciona.

Por exemplo, não existe o nome do prédio de minha casa, mas a rua tem um nome. Se eu quiser pegar o endereço direto pra minha casa, vou apertar com o botão direito no google maps, e selecionar “Como chegar a partir daqui”, e uma coordenada vai ser fornecida, já que não é uma rodovia, rua, etc, e sim um local.

Os padrões do google são espaço simples ( & nbsp; ) na url = %20 por exemplo, então: Minha Casa = Minha%20Casa

Entendi, estou realizando um teste aqui e logo mais posto os resultados.
Muito obrigado por esclarecer minhas duvidas.

realizei um simples teste em colocar a URL em um link e o destino buscar do que foi cadastrado dessa forma:
Ver no Mapa (não sei se é correto isso)

o erro que retorna é :

javax.faces.view.facelets.FaceletException: Error Parsing /Clientes/pesquisaCliente.xhtml: Error Traced[line: 39] The reference to entity “daddr” must end with the ‘;’ delimiter.
com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:425)
com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:408)
com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:130)
com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:327)
com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:93)
com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:166)
com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:164)
com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:94)
com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:89)
com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
java.util.concurrent.FutureTask.run(Unknown Source)
com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:143)
com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:62)
com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:260)
com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:209)
com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:233)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.

isso já são outros 500, hehe
O JSF é tudo de bom, mas existem algumas coisas que esse danado precisa aprender a interpretar ainda. Ao digitar o & (e-comercial), ele aguarda algum código, por exemplo,

& gt;
& lt;
& nbsp;

etc., que quando juntos (eu coloquei um espaço ali), produzem um resultado, no caso, <> e espaço.
então, pra resolver isso, você adiciona o código do componente & se não me engano. ( & #38; )

eis aqui uma lista completa desses caracteres:

http://www.w3schools.com/tags/ref_entities.asp

Brother, tu é o cara!! :lol:

É isso ai mesmo, funcionou certinho hahaha
troquei o “&” por aquele código e funcionou…

Muito obrigado!!

Só mais uma questão :smiley:

dessa forma que coloquei pelo quando clico no link ele redireciona para o site do google com a rota certinho. Como ficaria pra ele carregar em um pop-up ou dialog para que a pagina com as informações do usuário não mudasse, apenas mostrasse a rota em uma outra “telinha”.

isso eu nunca tentei fazer, mas você tentou colocar dentro de um iframe e então num dialog?

tentei colocar dentro do dialog, mas ai não sei como mostrar dentro dele. :?

Acessa o endereço do maps.google.com e coloca as coordenadas lá, existe uma pequena corrente (icone) que te dá o iframe pronto, basta copiar o código. Apenas joga o endereço lá.

Deu certo!!

Coloquei o link do iframe dentro do dialog e funcionou que é uma beleza :smiley: :smiley:

Ficou assim:

<h:outputText value="Endereço: " />
<h:panelGroup>
  <p:inputText id="endereco" value="#{cadastroClienteBean.clienteEdicao.endereco}" size="45" required="true" onkeyup="this.value = this.value.toUpperCase();" />
  <p:commandButton id="verMapa" icon="ui-icon-image" title="Ver no Mapa" onclick="dlgMap.show()" type="button" />
</h:panelGroup>
<br/>

<p:dialog id="endMap" header="Endereço" showEffect="explode" hideEffect="clip" widgetVar="dlgMap">  
  <iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.com/maps....."></iframe><br /><small><a href="https://maps.google.com/maps...">Exibir mapa ampliado</a></small>		      
		</p:dialog> 

Obrigado mais uma vez andre!!

agora que reparei nos testes, por mais que o endereço mude a rota sempre fica a mesma. Mesma origem e mesmo destino (mesmo alterando o destino no mapa não muda).
Deve ser algo no link do iframe.

Amigos estou na mesma situação, preciso montar a rota,

estou utilizando primefaces, sei que não é uma boa levantar o tópico.

Poderiam ajudar ??

Obrigado;

[quote=marciofermino]Amigos estou na mesma situação, preciso montar a rota,

estou utilizando primefaces, sei que não é uma boa levantar o tópico.

Poderiam ajudar ??

Obrigado;[/quote]

Opa blz? vc chegou a utilizar o exemplo de codigo? estou usando daquela maneira e funcionou. Como vc precisa que funcione, qual sua duvida?

Já faz algum tempo que perguntaram, mas vou deixar como eu fiz aqui. Dá pra fazer com o primefaces direto, eu só não consegui resolver um problema com curvas. Mas pra quem interessar, é até simples:

Usei um método de exemplo do próprio Google, vou colocar ela aqui pq não estou achando o link dela:

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
import org.primefaces.model.map.LatLng;
import org.xml.sax.SAXException;

public class GeocodingSample {

    private static final String GEOCODER_REQUEST_PREFIX_FOR_XML = "http://maps.google.com/maps/api/geocode/xml";
    private static final String DESTINATION_REQUEST_PREFIX_FOR_XML = "http://maps.googleapis.com/maps/api/directions/xml?origin=";

    public LatLng latitudeLongitude(String address) throws UnsupportedEncodingException, MalformedURLException, IOException, ParserConfigurationException, SAXException, XPathExpressionException{
        // prepare a URL to the geocoder
        URL url = new URL(GEOCODER_REQUEST_PREFIX_FOR_XML + "?address=" + URLEncoder.encode(address, "UTF-8") + "&sensor=false");

        // prepare an HTTP connection to the geocoder
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        Document geocoderResultDocument = null;
        try {
            // open the connection and get results as InputSource.
            conn.connect();
            InputSource geocoderResultInputSource = new InputSource(conn.getInputStream());

            // read result and parse into XML Document
            geocoderResultDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(geocoderResultInputSource);
        } finally {
            conn.disconnect();
        }

        // prepare XPath
        XPath xpath = XPathFactory.newInstance().newXPath();

        // extract the result
        NodeList resultNodeList = null;
//
//            // a) obtain the formatted_address field for every result
//            resultNodeList = (NodeList) xpath.evaluate("/GeocodeResponse/result/formatted_address", geocoderResultDocument, XPathConstants.NODESET);
//            for(int i=0; i<resultNodeList.getLength(); ++i) {
//                System.out.println(resultNodeList.item(i).getTextContent());
//            }
//
//            // b) extract the locality for the first result
//            resultNodeList = (NodeList) xpath.evaluate("/GeocodeResponse/result[1]/address_component[type/text()='locality']/long_name", geocoderResultDocument, XPathConstants.NODESET);
//            for(int i=0; i<resultNodeList.getLength(); ++i) {
//                System.out.println(resultNodeList.item(i).getTextContent());
//            }

        // c) extract the coordinates of the first result
        resultNodeList = (NodeList) xpath.evaluate("/GeocodeResponse/result[1]/geometry/location/*", geocoderResultDocument, XPathConstants.NODESET);
        float lat = Float.NaN;
        float lng = Float.NaN;
        for(int i=0; i<resultNodeList.getLength(); ++i) {
            Node node = resultNodeList.item(i);
            if("lat".equals(node.getNodeName())) lat = Float.parseFloat(node.getTextContent());
            if("lng".equals(node.getNodeName())) lng = Float.parseFloat(node.getTextContent());
        }
        return new LatLng(lat, lng);
//            System.out.println("lat/lng=" + lat + "," + lng);

        // c) extract the coordinates of the first result
//            resultNodeList = (NodeList) xpath.evaluate("/GeocodeResponse/result[1]/address_component[type/text() = 'administrative_area_level_1']/country[short_name/text() = 'US']/*", geocoderResultDocument, XPathConstants.NODESET);
//            lat = Float.NaN;
//            lng = Float.NaN;
//            for(int i=0; i<resultNodeList.getLength(); ++i) {
//              Node node = resultNodeList.item(i);
//              if("lat".equals(node.getNodeName())) lat = Float.parseFloat(node.getTextContent());
//              if("lng".equals(node.getNodeName())) lng = Float.parseFloat(node.getTextContent());
//            }
//            System.out.println("lat/lng=" + lat + "," + lng);
    }
    
    public ArrayList<LatLng> geraCoordenadasRota(LatLng latFunc, LatLng latVend) throws MalformedURLException, IOException, ParserConfigurationException, SAXException{
        ArrayList<LatLng> lista = new ArrayList<LatLng>();
        ArrayList<String> listaLat = new ArrayList<String>();
        ArrayList<String> listaLng = new ArrayList<String>();
        String coordFunc = String.valueOf(latFunc.getLat())+","+String.valueOf(latFunc.getLng());
        String coordVend = String.valueOf(latVend.getLat())+","+String.valueOf(latVend.getLng());
        URL url = new URL(DESTINATION_REQUEST_PREFIX_FOR_XML+coordFunc+"&destination="+coordVend+"&sensor=false");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        Document geocoderResultDocument = null;
        try {
            conn.connect();
            InputSource geocoderResultInputSource = new InputSource(conn.getInputStream());
            geocoderResultDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(geocoderResultInputSource);
        } finally {
            conn.disconnect();
        }
        NodeList nodes =  geocoderResultDocument.getElementsByTagName("lat");
        for (int i=0; i<nodes.getLength()-4; i++){
            Node node = nodes.item(i);
            listaLat.add(node.getTextContent());
        }
        nodes =  geocoderResultDocument.getElementsByTagName("lng");
        for (int i=0; i<nodes.getLength()-4; i++){
            Node node = nodes.item(i);
            listaLng.add(node.getTextContent());
        }
        for (int i=0; i<listaLat.size(); i++){
            lista.add(new LatLng(Double.parseDouble(listaLat.get(i)), Double.parseDouble(listaLng.get(i))));
        }
        return lista;
    }
}

O primeiro método é o de exemplo do Google, que retorna a latitude e longitude de um endereço(as partes comentadas do código servem pra mostrar todas as outras informações do endereço fornecido. O segundo método eu montei, ele só lê o xml de retorno do Google, encontra as coordenadas e retorna elas num ArrayList.
Depois, no seu bean, é só colocar um MapModel, adicionar o Polylines contendo esse ArrayList como parâmetro e no xhtml, setar o modelo do gmap como sendo o MapModel do seu bean.
Fiz o método hoje, então não testei ele muito, então se alguém tiver sugestão pra melhorar o método, ou mesmo pra deixar o código mais apresentável, eu agradeço também.

Abraços.