[Javascript] [RISOLTO] Problema con Google Maps e "Zero_Results"

turifasola

Nuovo Utente
14 Gen 2014
8
0
0
Salve! Probabilmente avevo postato nel Blog sbagliato la mia richiesta, per cui la riprongo qui. Sto cercando di rappresentare graficamente tutti i marker di segnalazioni inserite in un database access, non sono un esperto di Javascript ed ho cercato di modificare questo script per le mie esigenze ma ho un problema con gli indirizzi caricati nel database che Google map non trova o che non sono riportati correttamente. Ho provato diverse soluzioni ma non riesco a "saltare" l'errore "ZERO_RESULTS", con un codice del tipo "ON ERROR RESUME NEXT", cioè, "se trova l'errore di Zero_Results passa al record successivo...". Potete aiutarmi a risolvere il mio problema, dimodoché ogni volta che trova un record con una via non raggiungibile, salti l'errore e passi avanti?
Di seguito il mio script
HTML:
<%

 dbfile=Server.MapPath("xxx.mdb") 
 Set OBJdbConnection=Server.CreateObject("ADODB.Connect ion")
 OBJdbConnection.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&dbfile

 Set rs = Server.CreateObject("ADODB.Recordset")
 sql = "SELECT xxx.*, Tab_strade.* FROM Tab_strade INNER JOIN xxx ON Tab_strade.id_via = xxx.id_via"

 rs.Open sql, OBJdbConnection, 3, 3

 totale=rs.recordcount-1 
 do while not rs.eof

 via = via & rs.fields(8) &" milano" & "##" 
 titolo=titolo & rs.fields(10) & "##" 
 rs.movenext
 loop
 set rs = Nothing
 OBJdbConnection.Close
 set OBJdbConnection=Nothing 

 %>

 <html>
 <head>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
 <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
 <script type="text/javascript" src="Fluster2.packed.js"></script>


 <script type="text/javascript">

 var geocoder;
 var map;

 descrizioni = new Array(); 
 indirizzi = new Array();

 <%
 for wa= 0 to totale
 viax=split(via,"##")
 titolox=split(titolo,"##")
 vias=viax(wa)
 titolos=titolox(wa)
 %>1

 indirizzi[<%=wa%>]="<%=vias%>";
 descrizioni[<%=wa%>]="<%=titolos%>";

 <%
 next
 %>

 lunghciclo = descrizioni.length; //variabile di appoggio contenente il numero di elementi del vettore

 function visualizzamappa() {
 geocoder = new google.maps.Geocoder();
 var opzioni = {zoom: 13, mapTypeId: google.maps.MapTypeId.ROADMAP}

 map = new google.maps.Map(document.getElementById("map_canva s"), opzioni);

 // ciclo FOR che attiva la funzione di geocoding per ogni elemento del vettore indirizzi[x]


 for (var x=0; x<lunghciclo; x++)

 //window.setTimeout( function() { codifica_indirizzi(indirizzi[x], descrizioni[x]); }, 500 );}

 { codifica_indirizzi(indirizzi[x], descrizioni[x]); }

 }

 // funzione che effettua il geocoding dell'indirizzo stradale e crea il relativo marker completo di descrizione

 function codifica_indirizzi(indirizzi, titolo)

 { 
 geocoder.geocode({ 'address': indirizzi}, function(results, status)
 {
 map.setCenter(results[0].geometry.location);

 var marker = new google.maps.Marker
 ({ map: map, 
 position: results[0].geometry.location,
 title: titolo });


 });

 }

 </script>
 </head>

 <body style="margin:5px; padding:5px;" onload="visualizzamappa()">

 <div id="map_canvas" style="width:100%; height:100%"></div>

 </body>
 </html>
Grazie!
 
Ultima modifica di un moderatore:
Ciao, prova a vedere cosa ti restituisce il parametro "status"
Codice:
alert(status);
in base a quello potresti poi saltare le istruzione sucessive
Codice:
if(status == esitopositvo)  {

// codice

}
 
Ciao, prova a vedere cosa ti restituisce il parametro "status"
Codice:
alert(status);
in base a quello potresti poi saltare le istruzione sucessive
Codice:
if(status == esitopositvo)  {

// codice

}

Salve! Ti ringrazio per la tempestiva risposta. Aggiungo altre informazioni a quanto detto sopra. Se inserisco nel DB 11 record con vie che Google Map riconosce, funziona tutto perfettamente, appena trova una via (non coordinate) che non è identificata, si blocca facendomi vedere solo una finestra grigia. Diciamo che il codice che ho inserito sopra funziona bene facendomi vedere i marker nelle vie giuste e dandomi anche la descrizione, fino a quando non trova un campo con una via non identificata (da li Zero_Results) oppure se inserisco più record per "OVER_QUERY_LIMIT" (per questo ho fatto delle prove lasciando solo 11 record e funziona).
Purtroppo sono quasi negato in Javascript e spero di non sbagliare quando mi chiedi cosa restituisce "status" tu intenda dire quello che ti ho detto sopra. Nel caso di ASP scrivendo Response.Write avrei la risposta, ma nel caso di Javascript cosa dovrei inserire?
Ti dispiace farmi un esempio sul mio script così mi rendo conto visivamente delle correzioni. Scusami non voglio la pappa pronta ma ho dei limiti e c'ho provato e riprovato.
Grazie
 
ma nel caso di Javascript cosa dovrei inserire?
Codice:
alert(status);
ti si aprira un alert per ogni indirizzo, per quelli errati dovresti vedere un messaggio diverso
Codice:
function codifica_indirizzi(indirizzi, titolo)

    {
        geocoder.geocode({'address': indirizzi}, function(results, status)
        {
            alert(status);

            map.setCenter(results[0].geometry.location);

            var marker = new google.maps.Marker
                    ({map: map,
                        position: results[0].geometry.location,
                        title: titolo});

    }
    );
 
In teoria potresti provare cosi
Codice:
function codifica_indirizzi(indirizzi, titolo)

    {
        geocoder.geocode({'address': indirizzi}, function(results, status)
        {
            if (status == "OK") {

                map.setCenter(results[0].geometry.location);

                var marker = new google.maps.Marker
                        ({map: map,
                            position: results[0].geometry.location,
                            title: titolo});
            }

    }
    );
in alternativa posta un esempio di indirizzo errato che ci faccio qualche prova
 
In teoria potresti provare cosi
Codice:
function codifica_indirizzi(indirizzi, titolo)

    {
        geocoder.geocode({'address': indirizzi}, function(results, status)
        {
            if (status == "OK") {

                map.setCenter(results[0].geometry.location);

                var marker = new google.maps.Marker
                        ({map: map,
                            position: results[0].geometry.location,
                            title: titolo});
            }

    }
    );
in alternativa posta un esempio di indirizzo errato che ci faccio qualche prova


Scusami se non ti ho risposto subito ma ero in pausa pranzo.
Allora! Ho fatto come mi hai detto tu:
Come prima prova ho inserito l'Alert status e come risposta ho avuto 11 ok a conferma credo di aver capito che gli indirizzi sono corretti.Giusto?
Ho successivamente aggiunto un altro record al db con un nuovo indirizzo corretto (12simo record) e come risposta ho avuto un "OVER_QUERY_LIMIT" all'inizio e successivamente 11 ok.
Ho poi modificato tutta la funzione come mi hai suggerito e il risultato è stato l'apertura della finestra con i markers di tutti i record corretti ma fino all'11 non evidenziandomi neanche "OVER_QUERY_LIMIT". Mentre il 12simo Marker non lo visualizza. A questo punto per visualizzare tutti gli altri record dal 12 in poi ad esclusione di quelli errati cosa suggerisci? Mi sembra di essere ritornati al punto di partenza.
Comunque ti ringrazio infinitamente per la tua cortesia e disponibilità.
 
ma non son sicuro di aver capito perfettamente il problema ma se devi saltare quelli che ti restituiscono "ZERO_RESULTS"
modifica
Codice:
if (status == "OK") {
con
Codice:
if (status != "ZERO_RESULTS") {
 
ma non son sicuro di aver capito perfettamente il problema ma se devi saltare quelli che ti restituiscono "ZERO_RESULTS"
modifica
Codice:
if (status == "OK") {
con
Codice:
if (status != "ZERO_RESULTS") {

Grazieeee!! OK! PER QUANTO RIGUARDA "ZERO_RESULTS" mi ha saltato il record con l'indirizzo errato che ho messo apposta in mezzo agli 11 record, però mi rimane il problema del superamento dell' OVER_QUERY_LIMIT. Cioè visualizzare tutti gli altri record oltre il dodicesimo. Ho fatto qualche ricerca sui vari blog e qualcuno suggerisce di inserire un "setTimeout" ma come avrai potuto capire per me diventa quasi arabo. toglierei anche il "quasi"
 
per usare il setTimeout devi togliere il ciclo for
puoi provare modificando le due funzioni in questo modo
Codice:
// inizializziamo il contatore
    var x = 0;
    function visualizzamappa() {
        geocoder = new google.maps.Geocoder();
        var opzioni = {zoom: 13, mapTypeId: google.maps.MapTypeId.ROADMAP}

        map = new google.maps.Map(document.getElementById("map_canvas"), opzioni);
        // ciclo FOR che attiva la funzione di geocoding per ogni elemento del vettore indirizzi[x]
        codifica_indirizzi(indirizzi[x], descrizioni[x]);

    }
    // funzione che effettua il geocoding dell'indirizzo stradale e crea il relativo marker completo di descrizione
    function codifica_indirizzi(indirizzo, titolo) {
        geocoder.geocode({'address': indirizzo}, function(results, status) {

            if (status != "ZERO_RESULTS") {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker
                        ({map: map,
                            position: results[0].geometry.location,
                            title: titolo});
            }

            if (x < (indirizzi.length - 1)) {
                setTimeout(function() {
                    x++;
                    codifica_indirizzi(indirizzi[x], descrizioni[x]);
                }, 2000);
            }

        }
        );
    }
non ho modo di testare,inoltre non conosco i limiti di google quindi potresti non risolvere
nota:
ho cambiato anche il nome del parametro da indirizzi (uguale all'array) a indirizzo
Codice:
function codifica_indirizzi(indirizzo, titolo) {
 
Ultima modifica:
SEI UN GENIOOOOO!!!! Non sai quanto bene mi hai fatto! :tifoso: sei il mio idolo!
Non so come posso ringraziarti!
Posto lo script completo per chiuque volesse utilizzarlo.

HTML:
<%

 dbfile=Server.MapPath("xxx.mdb") 
Set OBJdbConnection=Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&dbfile



Set rs = Server.CreateObject("ADODB.Recordset")


sql= "SELECT * FROM tabellax"  
rs.Open sql, OBJdbConnection, 3, 3
'on error resume next
totale=rs.recordcount-1	
do while not rs.eof



via = via & rs.fields(1) &" Milano" & "##" 
civico=civico & rs.fields(1) & "##" 
titolo=titolo & rs.fields(1) & "##" 

rs.movenext
loop


set rs = Nothing
OBJdbConnection.Close
set OBJdbConnection=Nothing  

  
  %>
  
<html>
<head>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
 <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="Fluster2.packed.js"></script>

 
 <script type="text/javascript">



function Geocode(address) {
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
            var result = results[0].geometry.location;
            var marker = new google.maps.Marker({
                position: result,
                map: map
            });
        } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {    
            setTimeout(function() {
                Geocode(address);
            }, 200);
        } else {
            alert("Geocode was not successful for the following reason:" 
                  + status);
        }
    });
}




	var geocoder;
	var map;
	
	descrizioni = new Array();   
	civici = new Array();           
	indirizzi = new Array();
	
	
    
    <%
    for wa= 0 to totale
    viax=split(via,"##")
    civicox=split(civico,"##")
    titolox=split(titolo,"##")
    vias=viax(wa)
    civicos=civicox(wa)
    titolos=titolox(wa)
    %>1
	
	
	indirizzi[<%=wa%>]="<%=vias%>";
	civici[<%=wa%>]="<%=civicos%>";
	descrizioni[<%=wa%>]="<%=titolos%>";
	
	
	<%
    next
    %>




 	             
       // inizializziamo il contatore
    var x = 0;
    function visualizzamappa() {
        geocoder = new google.maps.Geocoder();
        var opzioni = {zoom: 13, mapTypeId: google.maps.MapTypeId.ROADMAP}

        map = new google.maps.Map(document.getElementById("map_canvas"), opzioni);
        // ciclo FOR che attiva la funzione di geocoding per ogni elemento del vettore indirizzi[x]
        codifica_indirizzi(indirizzi[x], descrizioni[x]);

    }
    // funzione che effettua il geocoding dell'indirizzo stradale e crea il relativo marker completo di descrizione
    function codifica_indirizzi(indirizzo, titolo) {
        geocoder.geocode({'address': indirizzo}, function(results, status) {

            if (status != "ZERO_RESULTS") {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker
                        ({map: map,
                            position: results[0].geometry.location,
                            title: titolo});
            }

            if (x < (indirizzi.length - 1)) {
                setTimeout(function() {
                    x++;
                    codifica_indirizzi(indirizzi[x], descrizioni[x]);
                }, 2000);
            }

        }
        );
}

</script>



</head>

<body style="margin:5px; padding:5px;" onload="visualizzamappa()">

<div id="map_canvas" style="width:100%; height:100%"></div>

</body>
</html>


Di nuovo grazie e alla prox!
Ciao
 
Ultima modifica di un moderatore:
Ciao a tutti, sono nuovo del forum ho letto questo articolo perchè ho la stessa problematica in questione ovvero il messaggio over query limit, premesso che non sono molto efferato con javascript, volevo sapere dove bisogna intervenire con il codice di cui sopra per ovviare al problema. Sto lavorando su un sito in joomla e sono giorni che mi sbatto per risolvere il problema. Non posso far altro che appellarmi a chi ne capisce molto piu di me. Grazie anticipatamente per la risposta...
 

Discussioni simili