Passar valores diferentes para geocodificar no Google Maps

9 respostas
brunoejaera

Boa Noite, estou fazendo um trabalho pra faculdade mas estou tendo dificuldade, eu vou falar o objetivo da aplicação e a dificuldade...lembrando que eu sou novato pessoal então não reparem nas burradas que eu fiz no código...rsrsr

Eu tenho que montar um arquivo XML com o nome,endereço,telefone e email de pessoas, depois através do HTML eu vou ler o nome das pessoas e criar um combox que deverá aparece somente o nome de todas elas (até ai já foi mó trampo)...depois eu vou usar o google maps pra mostrar o endereço que eu coloquei no XML, isso deve ser feito quando eu clicar em um nome no combobox, ou seja, cada nome tem seu endereço associado a ele e quando eu clicar no nome o google maps mi mostra o endereço pertencente aquela pessoa.

Bom, eu consegui fazer a parte de criar o XML e o combobox com o nome de todos e associar um endereço a cada um deles, a duvida está sendo na função " codeAddress() ", ela deve receber o endereço que eu quero geocodificar, se eu colocar um ID fixo lá dentro eu consigo mas a intenção é passar o endereço da pessoa que eu cliquei no combobox, vou dar um exemplo pra ficar menos dificil de intender.

Vamos supor que eu tenho 3 contatos: contato1,contato2 e contato3 e um endereço pra cada um deles, quando eu criei o meu combobox eu coloquei um ID pra cada option criado, ID=A,ID=B e ID=C, e esses ID's estão associados aos meus contatos, quando eu clicar em um contato eu vou chamar a função codeAddress() e vou passar pra ele o value(que seria o endereço) atraves do ID do meu option, o problema está em passar o ID de cada um deles, se eu clicar no contato1 eu quero passar o ID=A, se eu clicar no contato2 eu quero passar o ID=B e assim por diante.

Por favor mi ajudem, e se alguem tiver uma idéia de como criar o meu combox de uma forma mais elegante e eficiente eu aceito sugestões, lembrando pessoal que eu ainda não aprendi nada diferente de XML, HTML e javascript, ou seja, eu tenho que achar uma solução usando apenar eles...eu sei que estou exigindo mto, mas eu não tenho mais pra quem recorrer.

<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <title>Busca Contatos</title>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
        <script type="text/javascript">
            
            var geocoder;
            var map;
            
            function displayContatos(){
                if(window.XMLHttpRequest){
                    xmlhttp = new XMLHttpRequest();
                }
                else{
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                xmlhttp.open("GET","Contatos.xml",false);
                xmlhttp.send();
                xmlDoc = xmlhttp.responseXML;
            
                x = xmlDoc.getElementsByTagName("Pessoa");
                i = 0;
            
                var select = "<select id='select'></select>";
                document.getElementById("combo").innerHTML = select;
                var codigo = ' ';
                for(i = 0; i < x.length; i++){
                    nome = (x[i].getElementsByTagName("Nome")[0].childNodes[0].nodeValue);
                    endereco = (x[i].getElementsByTagName("Endereco")[0].childNodes[0].nodeValue);
                    telefone = (x[i].getElementsByTagName("Telefone")[0].childNodes[0].nodeValue);
                    email = (x[i].getElementsByTagName("Email")[0].childNodes[0].nodeValue);
                    var codigo = codigo + "<option id='"+ nome +"' value='"+ endereco +"'onclick='codeAddress()'>"+ nome + "</option>";
                }
                document.getElementById("select").innerHTML = codigo;
            }
            
            function initialize() {
                
                geocoder = new google.maps.Geocoder();
                var latlng = new google.maps.LatLng(-34.397, 150.644);
                var myOptions = {
                    zoom: 17,
                    center: latlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                }
                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
                displayContatos();
            }

            function codeAddress() {
                var address = document.getElementById("Natalia").value;
                if (geocoder) {
                    geocoder.geocode( { 'address' : address}, function(results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            map.setCenter(results[0].geometry.location);
                            var marker = new google.maps.Marker({
                                map: map, 
                                position: results[0].geometry.location
                            });
                        }
                        else {
                            alert("Geocode was not successful for the following reason: " + status);
                        }
                    });
                }
            }
        </script>
    </head>
    <body onload="initialize()">
        <div id="combo"></div>
        <div id='map_canvas'  style="width: 800px; height: 600px;"></div>
    </body>
</html>

9 Respostas

JoaoBluSCBR

Voce poderia postar teu xml apenas para facilitar alguns testes e tentar te ajudar.

brunoejaera

Pronto, coloquei poucos contatos, só msmo pra dizer que tem alguma coisa.

<?xml version="1.0" encoding="UTF-8"?>

<!-- Document : Contatos.xml Created on : 12 de Setembro de 2011, 14:05 Author : Bruno Description: Purpose of the document follows. -->
-<Contato>
    -<Pessoa>
        <Nome>Natalia</Nome> 
        <Endereco>R. Juscelino Kubitchek Oliveira - Francisco Morato</Endereco>
        <Telefone>4489-0751</Telefone> <Email>[email removido]</Email>
    </Pessoa>
   -<Pessoa>
        <Nome>Alex</Nome>
        <Endereco>Rua Minas Gerais - Francisco Morato</Endereco>
        <Telefone>4488-8587</Telefone> <Email>[email removido]</Email>
    </Pessoa>
   -<Pessoa> 
        <Nome>Unisant'anna</Nome>
        <Endereco>Rua Voluntários da Pátria - Santana</Endereco>
        <Telefone>2175-8000</Telefone>
        <Email>Não Possui</Email>
    </Pessoa>
   -<Pessoa>
        <Nome>Henrique</Nome>
        <Endereco>Rua Anhanguera - Francisco Morato</Endereco>
        <Telefone>4489-3513</Telefone>
        <Email>[email removido]</Email>
    </Pessoa>
</Contato>
JoaoBluSCBR

Onde você colocou esse arquivo Contatos.xml?

Em que pasta, o meu Combo está vindo vazio.

brunoejaera

Ele fica na pasta nativa do IDE.

Ajuda se eu mandar o arquivo pra vc do XML ?? Bom, de qlqr forma eu vou mandar, vai que ajuda em alguma coisa… =]

JoaoBluSCBR

Eu montei o arquivo xml, apenas no meu caso o combo está vazio, entao estou imaginando que
o arquivo nao está sendo lido ou localizado.

Mas estou testando. Assim que tiver algo te passo.

JoaoBluSCBR

Voce tem certeza que quando executa teu combo aparece com os nomes dos teus contatos?

brunoejaera

Opa cara, agora que vc falou eu fui dar uma olhada e realmente não estava…uma linha está fora do lugar.

Na função Initialize() na ultima linha ele chama a função displayContatos(), na realidade essa linha tem que ser a primeira linha da função pra aparecer o combo.

Então vc coloca a linha que chama o displayContatos() em cima dessa linha " geocoder = new google.maps.Geocoder(); "… ambas as linhas estão dentro da função Initialize().

Desculpa msmo essa vacilada, eu tava tentando geocodificar o endereço e nos testes acabei mexendo nessa linha e esqueci de arrumar, desculpa msmo.

JoaoBluSCBR

Fiz algumas mudancas inclusive no nome do teu select, por que chamar um select de select eh apelacao, nao? kkkkkkk

Mudei o evento para o select e nao para cada item e mais tornei a variavel x externa para manter a lista de pessoas e
usa-la novamente.

Veja aíh se te ajuda, foi uma pauleira para fazer funcionar.

boa sorte. Ja gastei tempo demais com esse teu problema.

abs

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html> 
<html>   
    <head>   
        <title>Busca Contatos</title>   
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />   
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>   
        <script type="text/javascript">   
               
            var geocoder;   
            var map;   
            var x;
               
            function displayContatos(){   
                if(window.XMLHttpRequest){   
                    xmlhttp = new XMLHttpRequest();   
                }   
                else{   
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   
                }   
                xmlhttp.open("GET","Contatos.xml",false);   
                xmlhttp.send();   
                xmlDoc = xmlhttp.responseXML;   
               
                x = xmlDoc.getElementsByTagName("Pessoa");   
                i = 0;   
               
                var select = "<select id='selecao' onchange='codeAddress()'></select>";   
                document.getElementById("combo").innerHTML = select;   
                var codigo = ' ';   
                for(i = 0; i < x.length; i++){   
                    nome = (x[i].getElementsByTagName("Nome")[0].childNodes[0].nodeValue);   
                    endereco = (x[i].getElementsByTagName("Endereco")[0].childNodes[0].nodeValue);   
                    //telefone = (x[i].getElementsByTagName("Telefone")[0].childNodes[0].nodeValue);   
                    //email = (x[i].getElementsByTagName("Email")[0].childNodes[0].nodeValue);   
                    codigo = codigo + "<option id='"+ nome +"' value='"+ endereco +"'>"+ nome + "</option>";                    
                }   
                document.getElementById("selecao").innerHTML = codigo;                                
            }   
               
            function initialize() {   
                 
                displayContatos(); 
                geocoder = new google.maps.Geocoder();   
                var latlng = new google.maps.LatLng(-34.397, 150.644);   
                var myOptions = {   
                    zoom: 17,   
                    center: latlng,   
                    mapTypeId: google.maps.MapTypeId.ROADMAP   
                }   
                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);   
                  
            }   
  
            function codeAddress() {   
                var i = document.getElementById("selecao").selectedIndex;   
                address = (x[i].getElementsByTagName("Endereco")[0].childNodes[0].nodeValue);                
                
                if (geocoder) {   
                    geocoder.geocode( { 'address' : address}, function(results, status) {   
                        if (status == google.maps.GeocoderStatus.OK) {   
                            map.setCenter(results[0].geometry.location);   
                            var marker = new google.maps.Marker({   
                                map: map,   
                                position: results[0].geometry.location   
                            });   
                        }   
                        else {   
                            alert("Geocode was not successful for the following reason: " + status);   
                        }   
                    });   
                }   
            }   
        </script>   
    </head>   
    <body onload="initialize()">   
        <div id="combo"></div>   
        <div id='map_canvas'  style="width: 800px; height: 600px;"></div>   
    </body>   
</html>
brunoejaera

Puts cara, vlw msmo heim, testei aqui e foi tudo certinho…vc mi ajudo pra caramba, brigadão, até já mi deu uma idéia de como fazer a ultima parte do trabalho…mto obrigado… =]

Criado 19 de setembro de 2011
Ultima resposta 21 de set. de 2011
Respostas 9
Participantes 2