我正在尝试使用谷歌距离矩阵api计算n个点之间的距离。
这是代码
var sum=0;
for(i=1;i < locations.length;i++){
var origin = locations[i-1];
var destination = locations[i];
var service = new google.maps.DistanceMatrixService;
service.getDistanceMatrix({
origins: [origin],
destinations: [destination],
travelMode: 'DRIVING',
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, function(response, status) {
if (status !== 'OK') {
alert('Error was: ' + status);
} else {
sum += response.rows[0].elements[0].distance.value;
}
});
}
但这不起作用。因为我的循环快速完成谷歌距离矩阵响应。我知道这是错的,它不会起作用。因此我决定使用我最喜欢的异步库async.js。但那我该怎么做呢?
origin = locations[i-1]
destination = locations[i].
我只使用async.each获取该集合的单个元素,这是我选择的方法。我应该选择async.js的哪种方法来处理这些问题?或者我应该采用一些完全不同的方法来解决这个问题?
帮助表示赞赏 萨拉斯
修改
对于那些问我为什么这样做的人?我想像Uber为自己的应用程序准确计算距离,我正在为此收集大量数据点(实时位置坐标)。但我不知道他们如何准确地计算距离(另一种方式是方向API,但我发现它并不那么好)。我只能猜测他们正在使用距离矩阵API并将其应用于旅行中的100多个数据点以计算距离。
答案 0 :(得分:1)
同步从数组中选择元素并将它们放在另一个数组中:
var legs = [];
for (var i=1; i<locations.length; i++)
legs.push({origin:locations[i-1], destination:locations[i]});
然后,您可以使用您选择的async.js方法迭代该数组,可能是map
或mapSeries
,或者reduce
如果你想做的就是求和距离。
async.map(legs, function(leg, cb) {
service.getDistanceMatrix({
origins: [leg.origin],
destinations: [leg.destination],
…
}, cb);
}, function(err, responses) {
…
})