Я верю, что вы правы. Кажется, в API нет текущего метода, который позволил бы вам сделать следующее.
Вместо этого я перебрал координаты, полученные из вызова службы маршрутов, и использовал функцию для вычисления расстояния между координатами. Однако даже это не было достаточно точным, так как возвращенные координаты также казались агрегированными и не возвращали точное значение / расстояние при расчете расстояний между каждой координатой, поскольку они агрегированы, и, следовательно, каждая координата не является необходимой вдоль дороги.
Чтобы обойти эту проблему, я добавил событие щелчка и сам нанес координаты вдоль дороги, а затем сохранил их в локальном файле json, который я кеширую и вызываю с помощью xmlhttprequest.
К счастью, для моей ситуации мне нужно только рассчитать расстояние между точками A и B на одной отдельной дороге, поэтому моя альтернатива не сработает в тех случаях, когда вы используете несколько или общие дороги / места. Вместо этого вы можете использовать первый описанный метод, учитывая, что вы готовы жить с агрегированными данными и неточными вычислениями.
Ниже приведены функции, используемые для расчета расстояний между координатами, а также окончательного расчета для нахождения точки и координат между последними двумя точками. Обратите внимание, что этот код использует и использует методы jQuery.
1. Рассчитать расстояние (в метрах) между двумя координатами
function pointDistance( begin, end )
{
var begin = { lat: begin[0], long: begin[1] },
end = { lat: end[0], long: end[1] };
// General calculations
var earthRadius = 6371, //km
distanceLat = (end.lat - begin.lat).toRad(),
distanceLong = (end.long - begin.long).toRad();
// Convert lats to radiants
begin.lat = begin.lat.toRad();
end.lat = end.lat.toRad();
// Calculation
var a = Math.sin(distanceLat / 2) * Math.sin(distanceLat / 2) +
Math.sin(distanceLong / 2) * Math.sin(distanceLong / 2) * Math.cos(begin.lat) * Math.cos(end.lat);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var distance = (earthRadius * c) - 0.000536;
return (distance * 1000);
}
2. Получить координату конечной координаты A-B (на основе оставшегося процента). Переменная 'matrix' - это массив координат json.
function getCoordinates( totalDistance )
{
var lastPoint = { lat: null, long: null },
total = parseFloat(0),
position = { start: null, end: null, distance: 0 };
$(matrix).each(function()
{
if ( lastPoint.lat == null )
{
lastPoint = { lat: this[0], long: this[1] };
return;
}
var distance = pointDistance([lastPoint.lat, lastPoint.long], [this[0], this[1]]);
total = total + distance;
if ( (total / 1000) >= totalDistance )
{
position.start = new google.maps.LatLng(lastPoint.lat, lastPoint.long);
position.end = new google.maps.LatLng(this[0], this[1]);
position.distance = total;
return false;
}
lastPoint = { lat: this[0], long: this[1] };
});
return position;
}
3. Преобразовать числовые градусы в радианы
if ( typeof(Number.prototype.toRad) === 'undefined' ) {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
}
Надеюсь, что следующее поможет любому с той же или симуляционной проблемой. Я не исследовал это, так как мне не было необходимости, но, возможно, если вы имеете дело с платными сервисами Google, они не агрегируют данные, возвращаемые звонком?