Google Maps API - GDirections.getDuration()第一次返回null,第二次返回

问题描述:

我与Google Maps API存在两难境地 - 我使用GDirections对象来获得在两点之间旅行所需的时间。Google Maps API - GDirections.getDuration()第一次返回null,第二次返回

我已经在Firebug中测试了下面的代码,以便我影响这一个调用的其他代码的机会很低(我无法链接到实际的地图;它在本地计算机上)。

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就是我写的打印它的参数Firebug的调试日志的功能。当我运行该代码时,它输出searchString from: NY, USA to: CA, USA并调用回调函数。但是,它输出null而不是GDirections对象的持续时间。

接着,我运行

C.console(myDir.getDuration()) 

并根据需要它。OUPUTS

Object seconds=157994 html=1 day 20 hours 

。有谁知道为什么这需要两个电话才能工作?我认为这是时间依赖性的,因为在代码中,如果我只是简单地调用它两次,它会连续给我两次,这并不令人惊讶。不过,我已经使用事件侦听器来等待它完成加载。我也尝试使用addoverlay事件而不是load事件,但这也不起作用。

有没有人见过这个或有想法,我怎么能解决它?任何帮助将不胜感激!

这真让我非常震撼。我打的代码,这个工程:

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); 

除了一个变量的变化(myDir现在directions),我用了一个匿名函数为回调函数。看起来这是一个范围问题,也许是第二次通过变量定义,所以它不再是null。无论如何,这似乎现在正常工作 - 我希望这也可以帮助其他人。

我记得我有一个类似的问题,但它是不同的性质,但问题结构是相同的。我不得不点击它两次才能正常工作。我终于想通了,这里是代码,我在谷歌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> 

原贴通过看这个我记得第一个GET方向运行的线程,然后第二个是也作为一个线程运行,那么为什么它需要2次点击是因为当你做gdirection时第二个没有加载hense值仍然为空。因此,你需要一些怎么也得让gdirection等到第一和第二返回其值

注:在上面的代码中的两个回调

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

注:此功能gSecondSearch.execute(的toAddress)正在运行里面的函数firstSearch()

//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); 

} 

我解决它的方式是把它放到回调函数中。当过程结束

所以这里的回调函数被调用的步骤是

  1. 得到第一个位置(纽约州​​)
  2. 后你得到的第一个位置(NY)获取第二位置(CA )通过在第一个位置的回调内查找功能
  3. 而finaly地图这些2,你似乎做OK了那里,但唯一不同的是,你在第二个函数的回调映射它

如果你仍然迷失在这个概念上,让我知道。il编辑它并将它分开多一点,这样你就可以理解,但它应该可以解决你的问题

+0

我很欣赏的响应 - 它似乎并不像我的问题是相同的,但。我只有一个过程,获取方向 - 我认为GDirections对象可以查询“从:NY,USA到:CA,USA”,并且能够获取方向。这些位置已经被找到并且保存在先前的功能中 - 一个是用户输入的,另一个是反向地理编码的。 – munchybunch 2009-08-07 21:29:43

+0

:D很好,你修正了它..但我想只是当你在这个API上运行两个函数时小心,导致它线程的所有功能和烦人,当你想要顺序执行的事情:D – 2009-08-07 22:48:24

你的问题是,这条线

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

导致C.console必须立即执行的,不管它返回将被用作回调函数。这不是你想要的。你想要的是C.console在回调发生时被调用。要做到这一点的方法之一是

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

如何使用GDirections对象?

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

错误:dir.getDistance()没有被定义....

>如何使用GDirections对象

回复上面的查询,可以经过以下连结其示出了使用 GDirection在以下事情中恢复:

a) Distance between the two locations b)两个locon之间的持续时间。

follow this link to know more about uage of GDirection