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);
}
我解决它的方式是把它放到回调函数中。当过程结束
所以这里的回调函数被调用的步骤是
- 得到第一个位置(纽约州)
- 后你得到的第一个位置(NY)获取第二位置(CA )通过在第一个位置的回调内查找功能
- 而finaly地图这些2,你似乎做OK了那里,但唯一不同的是,你在第二个函数的回调映射它
如果你仍然迷失在这个概念上,让我知道。il编辑它并将它分开多一点,这样你就可以理解,但它应该可以解决你的问题
你的问题是,这条线
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之间的持续时间。
我很欣赏的响应 - 它似乎并不像我的问题是相同的,但。我只有一个过程,获取方向 - 我认为GDirections对象可以查询“从:NY,USA到:CA,USA”,并且能够获取方向。这些位置已经被找到并且保存在先前的功能中 - 一个是用户输入的,另一个是反向地理编码的。 – munchybunch 2009-08-07 21:29:43
:D很好,你修正了它..但我想只是当你在这个API上运行两个函数时小心,导致它线程的所有功能和烦人,当你想要顺序执行的事情:D – 2009-08-07 22:48:24