javascript - 有什么方法可以让 Google Directions 路线前进 X 分钟?
问题描述
我有来自 Google Directions API 的路线,它有起点和终点,以及中间的一堆点。如果你从某一点开始并沿着那条路线走 X 分钟,有什么办法可以计算出你会在哪里?
基本上,有没有办法获得一段具有特定旅行时间长度的路线,而不仅仅是距离?
解决方案
假设(正如我从您的问题中推测的那样)您有一个有效的google.maps.DirectionsResult对象。
这个对象有一个routes
属性,它是google.maps.DirectionsRoute类型的对象。通常你只有一条路线。所述路线将具有一个google.maps.DirectionsLeglegs
数组的属性。
在这一点上,你可以说你有一个变量legs
是
var legs = myDirectionsResult.routes[0].legs;
可以有一条或多条腿(根据您的航路点)。每条腿都有一个steps
属性,它是一个google.maps.DirectionsStep数组。
每个步骤都具有start_location
、end_location
和duration
等属性distance
。
所以,最后,你可以得到你的路线的步骤:
var steps = myDirectionsResult
.routes[0]
.legs
.reduce(function(accum,leg) {
accum=accum.concat(leg.steps);
return accum;
},[]);
现在您可以迭代这些步骤,直到达到您的时间限制:
var currentStep,
duration,
start_location,
end_location,
timeSpent,
totalSteps = steps.length,
timelimit = 900; // seconds.
for(var i=0; i < totalSteps; i++) {
currentStep = steps[i];
duration = currentStep.duration.value;
start_location= currentStep.start_location;
end_location = currentStep.end_location;
if(timeSpent + duration > timelimit) {
break;
}
timeSpent = timeSpent + duration;
}
所以让我们分解一下。您有一系列步骤和时间限制。您迭代这些步骤。在每个步骤开始时,您检查完成此步骤是否会使您的旅行时间超出您的时间限制,在这种情况下您会中断循环。否则,您将步骤的持续时间添加到您花费的时间并继续下一个。
既然你开始声明你的时间限制是 900 秒,你最终会到达一个你已经花费了 850 秒的点,而当前步骤的持续时间是 100 秒,所以你无法完成这一步。您已经设置了此步骤的开始和结束位置,因此您打破了循环,并且您知道您可以到达这两个位置之间的某个位置,直到完成您的时间限制。
在这种情况下,步骤的持续时间为 100 秒,而您只剩下 50 秒,因此您知道您已到达当前步骤的开始位置和结束位置之间的中点。您需要在这些位置之间进行插值以了解最终坐标。您可以手动执行此操作,以防您认为,对于小距离,坐标之间的差异表现得就像它们在笛卡尔平面上一样。(参见小角度近似),但您也可以使用谷歌地图的几何库(参见google.maps.geometry.spherical.interpolate)
推荐阅读
- javascript - 带有 PubSub 的 Socket.io:多页面刷新后几乎没有实时数据显示
- r - R:data.table,按存储在变量中的列名聚合数据框
- arrays - 如何在 Swift 中编写语法二维数组两种类型的数组
- c# - Linq SUM 值错误
- visual-studio - Azure WebJob - 创建目录失败
- javascript - 将 jQuery ajax 调用写入 JavaScript 的 XmlHttpRequest
- javascript - MomentJS plus Map 已弃用错误
- algorithm - 具有递归和循环的程序的时间复杂度
- regex - sed -n 中的多模式
- css - 如何使用角材料表使表中的按钮响应