首页 > 解决方案 > 有什么方法可以让 Google Directions 路线前进 X 分钟?

问题描述

我有来自 Google Directions API 的路线,它有起点和终点,以及中间的一堆点。如果你从某一点开始并沿着那条路线走 X 分钟,有什么办法可以计算出你会在哪里?

基本上,有没有办法获得一段具有特定旅行时间长度的路线,而不仅仅是距离?

标签: javascriptgoogle-maps-api-3

解决方案


假设(正如我从您的问题中推测的那样)您有一个有效的google.maps.DirectionsResult对象。

这个对象有一个routes属性,它是google.maps.DirectionsRoute类型的对象。通常你只有一条路线。所述路线将具有一个google.maps.DirectionsLeglegs数组的属性。

在这一点上,你可以说你有一个变量legs

var legs = myDirectionsResult.routes[0].legs;

可以有一条或多条腿(根据您的航路点)。每条腿都有一个steps属性,它是一个google.maps.DirectionsStep数组。

每个步骤都具有start_locationend_locationduration等属性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


推荐阅读