Как получить общее проезжающее расстояние с Google Maps API V3?

Я раньше мог получить его как это:

directionsService.route(directionsRequest, function(directionsResult, directionsStatus) {
    var directionsRenderer = new google.maps.DirectionsRenderer({
        directions: directionsResult,
        map: map
    });
    $('#distance').text(directionsResult.trips[0].routes[0].distance.text)
    $('#duration').text(directionsResult.trips[0].routes[0].duration.text)
})

Но похоже, что они изменили свой API на мне! Похож trips больше не там, и routes только дает Вам набор участков... я должен действительно выполнить итерации по всем участкам и подвести итог расстояния теперь?

24
задан ekad 18 November 2017 в 09:07
поделиться

2 ответа

Согласно Ответ Ленила :

var totalDistance = 0;
var totalDuration = 0;
var legs = directionsResult.routes[0].legs;
for(var i=0; i<legs.length; ++i) {
    totalDistance += legs[i].distance.value;
    totalDuration += legs[i].duration.value;
}
$('#distance').text(totalDistance);
$('#duration').text(totalDuration);

На самом деле, это тоже отлично работает, если у вас нет путевых точек:

$('#distance').text(directionsResult.routes[0].legs[0].distance.text);
$('#duration').text(directionsResult.routes[0].legs[0].duration.text);

Вот более полный пример с использованием lodash . Не должно быть слишком сложно заменить flat на и sum , если вы его не используете.

/**
 * Computes the total driving distance between addresses. Result in meters.
 *
 * @param {string[]} addresses Array of address strings. Requires two or more.
 * @returns {Promise} Driving distance in meters
 */
export default function calculateDistance(addresses) {
    return new Promise((resolve, reject) => {
        if(addresses.length < 2) {
            return reject(new Error(`Distance calculation requires at least 2 stops, got ${addresses.length}`));
        }

        const {TravelMode, DirectionsService, DirectionsStatus} = google.maps;

        const directionsService = new DirectionsService;
        const origin = addresses.shift();
        const destination = addresses.pop();
        const waypoints = addresses.map(stop => ({location: stop}));

        directionsService.route({
            origin,
            waypoints,
            destination,
            travelMode: TravelMode.DRIVING,
        }, (response, status) => {
            if(status === DirectionsStatus.OK) {
                let distances = _.flatMap(response.routes, route => _.flatMap(route.legs, leg => leg.distance.value));

                return resolve(_.sum(distances));
            } else {
                return reject(new Error(status));
            }
        });
    });
}

Не забудьте включить Google Maps API:

<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&libraries=places"></script>

Кроме того, я почти уверен, что их ToS требуют, чтобы вы также отображали Google Map.

44
ответ дан 28 November 2019 в 22:34
поделиться

Посмотрите здесь:

Объект Directions Results

Похоже, что теперь вам нужно просуммировать расстояние до каждой ноги.

legs[] содержит массив объектов DirectionsLeg, каждый из которых содержит информацию об участке маршрута, из двух мест в пределах заданного маршрута. Отдельная нога будет будет присутствовать для каждой путевой точки или указанного пункта назначения. (Маршрут с без путевых точек будет содержать ровно одну DirectionsLeg.) Каждый этап состоит из серии DirectionSteps.

12
ответ дан 28 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: