2009-08-07 16 views
1

Ich habe ein Dilemma mit dem Google Maps API - ich verwende das Objekt GDirections, um die Zeit zu erhalten, die ich zwischen zwei Punkten zurücklegen muss.Google Maps API - GDirections.getDuration() gibt null zum ersten Mal zurück, funktioniert zum zweiten Mal

Ich habe den folgenden Code in Firebug getestet, so dass die Chancen, dass der Rest meines Codes diesen einen Aufruf beeinflusst, gering ist (ich kann nicht mit der tatsächlichen Karte verknüpfen; es ist auf einem lokalen Computer).

var start = "NY, USA"; 
var end = "CA, USA"; 
var searchString = "from: " + start + " to: " + end; 

C.console(searchString); 

var myDir = new GDirections(); 

GEvent.addListener(myDir,"load",C.console(myDir,getDuration())); 
myDir.load(searchString); 

C.console ist nur eine Funktion, die ich schrieb seine Argumente an die Firebug Debug-Protokoll zu drucken. Wenn ich diesen Code ausführe, gibt es den searchString from: NY, USA to: CA, USA aus und die Callback-Funktion wird aufgerufen. Es gibt jedoch null lieber als die Dauer des Objekts GDirections aus.

nächste I laufen

C.console(myDir.getDuration()) 

und ouputs

Object seconds=157994 html=1 day 20 hours 

wie gewünscht. Weiß jemand, warum es zwei Anrufe benötigt, damit das funktioniert? Ich denke, es ist zeitabhängig, denn im Code, wenn ich es einfach zweimal anrufe, gibt es zwei Mal hintereinander null, was nicht ganz überraschend war. Ich verwende den Ereignis-Listener jedoch bereits, um darauf zu warten, dass er vollständig geladen ist. Ich habe auch versucht, das addoverlay Ereignis anstelle des load Ereignisses zu verwenden, aber das funktioniert auch nicht.

Hat jemand das schon mal gesehen oder hat Ideen, wie ich es beheben kann? Jede Hilfe würde sehr geschätzt werden!

Antwort

0

Das hat mich wirklich boggled. Ich mit dem Code gespielt, und das funktioniert:

var start = "NY, USA"; 
var end = "CA, USA"; 
var searchString = "from: " + start + " to: " + end; 

C.console(searchString); 

var directions = new GDirections(); 
GEvent.addListener(directions,"load",function() { 
    C.console(directions.getDuration()); 
}); 

directions.load(searchString); 

Neben einer variablen Änderung (myDir ist jetzt directions), habe ich eine anonyme Funktion für die Callback-Funktion. Es scheint, dass es vorher ein Scope-Problem war, und vielleicht war das zweite Mal durch die Variable definiert worden und so war es nicht mehr null. Jedenfalls scheint das jetzt richtig zu funktionieren - ich hoffe, das hilft auch anderen.

0

Ich erinnerte mich, ich hatte ein ähnliches Problem, aber es war von einer anderen Natur, aber die Problemstruktur war die gleiche.

Ich musste es zweimal klicken, damit es funktioniert. Habe ich es endlich heraus und hier ist der Code, My Original Beitrag auf Google API (http://groups.google.com/group/Google-AJAX-Search-API/browse_thread/thread/c6c46cc8a0435eb0/f697b028bbce18db#f697b028bbce18db)

<script type='text/javascript'> 
google.load('search', '1'); 
google.load('maps', '2'); 

//Define our Globals 
var map;      //Map API 
var gdir;      //Direction API 
var gFirstSearch;  //The From Local Search 
var gSecondSearch;  //The To Local Search 

var fromAddress;  //From Address The user inputs 
var toAddress;   //To Address the user inputs 

var first;      //First Set of Results for From Search 
var second;    //Second Set of Results for To Search 

//On Load, Load all the Details Needed 
function OnLoad(){ 

     //Set up the Map and the Globals 
     //If the Browser Supports its 
     if (GBrowserIsCompatible()) { 
       map = new GMap2(document.getElementById("map")); 
       map.setCenter(new GLatLng(52.037366,-0.703726), 7); 
       map.removeMapType(G_HYBRID_MAP); 

       var mapControl = new GMapTypeControl(); 
       map.addControl(mapControl); 
       map.addControl(new GLargeMapControl()); 

       gdir = new GDirections(map); 
       GEvent.addListener(gdir, "load", onGDirectionsLoad); 
       GEvent.addListener(gdir, "error", handleErrors); 

       gFirstSearch = new google.search.LocalSearch(); 
       gFirstSearch.setCenterPoint(map); 
       gFirstSearch.setSearchCompleteCallback(null, FirstSearch); 

       gSecondSearch = new google.search.LocalSearch(); 
       gSecondSearch.setCenterPoint(map); 
       gSecondSearch.setSearchCompleteCallback(null, SecondSearch); 
     } 

} 

//Run the From Search 
//Runs after the gFirstSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function FirstSearch(){ 

     if (!gFirstSearch.results.length){ alert("Could Not Find: " + 
fromAddress + "\n Please Try Refining your 'From' Address Field"); 
return; } 
     //Return the First Result into a Variable 
     first = gFirstSearch.results[0]; 

     //Execute the Second 
     gSecondSearch.execute(toAddress); 

} 

//Run the To Search 
//Runs after the gSecondSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function SecondSearch(){ 

     if (!gSecondSearch.results.length){ alert("Could Not Find: " + 
toAddress + "\n Please Try Refining your 'To' Address Field"); 
return; } 

     //Returns the Second results into a Variable 
     second = gSecondSearch.results[0]; 

     //Plot our Graph 
     gdir.load("from: " + (first.lat + ", " + first.lng) + " to: " + 
(second.lat + ", " + second.lng)); 

} 

//Use to Execite our Form Commands 
function setDirections(ifromAddress, itoAddress) { 

     //Initiate the inputs into our Global Variables 
     fromAddress = ifromAddress; 
     toAddress = itoAddress; 

     //Execute our Search 
     gFirstSearch.execute(fromAddress); 

     //Return False so our broweser dosent Refresh 
     return false; 

} 

//Set the Values in our HTML after Direction has loaded 
function onGDirectionsLoad(){ 

     var miles = gdir.getDistance().meters * 0.000621371192; //Convert to 
Miles 
     document.getElementById("distance").innerHTML = "Distance: " + miles 
+ " ml"; 

     // and yada yada yada... 
} 

</script> 

Mit Blick auf diese ich erinnere mich, dass die erste Get Richtung als Thread ausgeführt wird, und dann die zweite ist auch run wie ein thread, also wieso es 2 klicks braucht ist weil wenn du die gdirection tust die zweite nicht geladen ist ist der wert immernoch null. Daher müssen Sie einige, wie gdirection Wartezeit machen, bis der erste und der zweite seinen Wert

Hinweis zurückgekehrt ist: die beiden Rückrufe in den obigen Code

gFirstSearch.setSearchCompleteCallback(null, FirstSearch); 
gSecondSearch.setSearchCompleteCallback(null, SecondSearch); 

Hinweis: Die Funktion gSecondSearch.execute (toaddress) wird innerhalb der Funktion Firstsearch() laufen

//Run the From Search 
//Runs after the gFirstSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function FirstSearch(){ 

    if (!gFirstSearch.results.length){ 
     alert("Could Not Find: " + fromAddress); 
     return; 
    } 

    //Return the First Result into a Variable 
    first = gFirstSearch.results[0]; 

    //Execute the Second 
    gSecondSearch.execute(toAddress); 

} 

der Weg i löste es sie in Callback-Funktion setzen sollte.Eine Rückruffunktion aufgerufen wird, wenn ein Prozess also hier fertig ist

sind die Schritte

  1. dem ersten Ort (NY) Erhalten
  2. Nachdem Sie den ersten Standort (NY) bekommen und die zweite Stelle (CA), indem Sie Karte die Suchfunktion innerhalb der Rückruf von der ersten Stelle
  3. Und finaly diese 2, die Sie in Ordnung, da oben zu tun scheinen, aber der einzige Unterschied ist, dass man es in den Rückruf der zweiten Funktionskarte

Wenn Sie immer noch auf dem Konzept verloren sind, lassen Sie mich wissen .. il bearbeiten Sie es und teilen Sie es ein bisschen mehr, so dass Sie verstehen können, aber es sollte Ihr Problem lösen

+0

Ich schätze die Antwort - es scheint nicht, wie mein Problem aber das gleiche ist. Ich habe nur einen Prozess, um die Anweisungen zu erhalten - ich denke, das GDirections Objekt ist in der Lage, eine Abfrage wie "aus: NY, USA nach: CA, USA" zu nehmen und in der Lage zu sein, die Anweisungen zu bekommen. Die Standorte wurden bereits gefunden und von einer vorherigen Funktion gespeichert - eine ist vom Benutzer eingegeben und die andere ist umgekehrt geokodiert. – munchybunch

+0

: D groß Sie es behoben .. aber ich denke, nur vorsichtig sein, wenn Sie zwei Funktionen auf dieser API ausführen, weil es alle Funktionen Threads und es nervt, wenn Sie Dinge nacheinander tun wollen: D –

2

Ihr Problem ist, dass diese Linie

GEvent.addListener(myDir,"load",C.console(myDir,getDuration())); 

C.console verursacht sofort ausgeführt werden soll, und was auch immer es zurückgibt, ist als die Callback-Funktion verwendet werden. Das ist nicht was du willst. Sie möchten, dass C.console beim Rückruf aufgerufen wird. Eine Möglichkeit, das zu tun, ist

GEvent.addListener(myDir,"load",function() { 
    C.console(myDir,getDuration()) 
}); 
0

Wie GDirections verwenden?

 var dir=new GDirections(map); 
var queryString="from: "+ map.getCenter()+"to: "+marker.getLatLng(); 
dir.load(queryString); 
alert(dir.getDistance().meters); 

Fehler: dir.getDistance() nicht definiert ....

Verwandte Themen