如何通过Google Maps API V3获得总驾驶距离?

mpe*_*pen 24 google-maps google-maps-api-3 driving-distance

我曾经能够像这样得到它:

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)
})
Run Code Online (Sandbox Code Playgroud)

但看起来他们改变的API!看起来trips不再存在了,routes只给你一堆腿...我真的必须迭代所有的腿并总结现在的距离吗?

mpe*_*pen 44

根据Leniel的回答:

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);
Run Code Online (Sandbox Code Playgroud)

实际上,如果您没有任何航路点,这也可以正常工作:

$('#distance').text(directionsResult.routes[0].legs[0].distance.text);
$('#duration').text(directionsResult.routes[0].legs[0].duration.text);
Run Code Online (Sandbox Code Playgroud)

这是使用lodash的更全面的例子.不要太难以替代flatBysum如果你不使用它.

/**
 * 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));
            }
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

请务必加入Google Maps API:

<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&libraries=places"></script>
Run Code Online (Sandbox Code Playgroud)

此外,我很确定他们的ToS也要求您显示Google地图.


Len*_*rri 12

看看这里:

方向结果对象

看起来你现在必须总结每条腿的距离.

legs []包含一个DirectionsLeg对象数组,每个对象包含有关给定路径中两个位置的路径支路的信息.对于指定的每个航点或目的地,将存在单独的航段.(没有航点的航线将只包含一个DirectionsLeg.)每条航线由一系列DirectionSteps组成.


cac*_*owe 7

马克的答案是米totalDistance和秒totalDuration.

如果你在美国并想要一个小数点的里程,那么就这样乘:

var METERS_TO_MILES = 0.000621371192;
$('#distance').text((Math.round( totalDistance * METERS_TO_MILES * 10 ) / 10)+' miles');
Run Code Online (Sandbox Code Playgroud)

如果你想要分钟:

$('#distance').text(Math.round( totalDuration / 60 )+' minutes');
Run Code Online (Sandbox Code Playgroud)


Ree*_*ves 5

你可以很容易地使用:

使用距离:

directionsDisplay.directions.routes[0].legs[0].distance.text
Run Code Online (Sandbox Code Playgroud)

使用时间:

directionsDisplay.directions.routes[0].legs[0].duration.text
Run Code Online (Sandbox Code Playgroud)