Допустим (как я полагаю из вашего вопроса), что у вас есть действительный google.maps.DirectionsResult объект.
Этот объект имеет свойство routes
, которое является объектом типа google.maps.DirectionsRoute . Обычно у вас будет только один маршрут. Указанный маршрут будет иметь свойство legs
, представляющее собой массив google.maps.DirectionsLeg .
В этот момент вы можете сказать, что у вас есть переменная 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 секунд, поэтому вы знаете, что достигли средней точки между начальной и конечной точкой текущего шага. Вы должны интерполировать между этими местоположениями, чтобы знать окончательные координаты. Вы можете сделать это вручную, если вы считаете, что для небольших расстояний разница между координатами ведет себя так же, как на декартовой плоскости. (См. Aproximation под малым углом ), но вы также можете использовать библиотеку геометрии карт Google (см. google.maps.geometry.spherical.interpolate )