2010-07-15 230 views
22

我曾经是能够得到这样的:如何通过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) 
}) 

但看起来他们对我改变了their API!看起来像trips已不在那里,routes只会给你一堆腿......我真的必须迭代所有的腿,现在总结距离吗?

回答

37

Leniel's answer

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一个更全面的例子。如果您不使用它,请不要太难替换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)); 
      } 
     }); 
    }); 
} 

请记住,包括谷歌地图API:

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

而且,我敢肯定他们的服务条款要求你显示谷歌地图了。

11

到这里看看:

The Directions Results Object

看起来你现在要总结每条腿的距离。

腿[]包含 为DirectionsLeg对象,每个对象的 包含有关 路线内 给定路线的腿,从两个位置信息的阵列。对于每个航路点,将会有一个单独的支路 或 指定的目的地。 (具有 的航线没有任何航点将精确包含一个 DirectionsLeg。)每个航段包含一个 系列DirectionSteps。

+0

所以......正是我所说的!虽然我误解了一个“腿”是什么。认为这是他们所说的“步骤”。迭代1条腿并不那么糟糕。 – mpen 2010-07-15 00:43:39

5

马克的答案是以米为单位的totalDistance和秒为totalDuration

如果您在美国并希望与一个小数点英里,乘象这样:

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

如果你想分钟:

$('#distance').text(Math.round(totalDuration/60)+' minutes'); 
1
<!DOCTYPE html> 
<html> 
<head> 
    <title>Simple Map</title> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 
     html, body, #map-canvas { 
      margin: 0; 
      padding: 0; 
      height: 100%; 
     } 
    </style> 
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script> 
    <script> 

     var directionsDisplay; 
     var directionsService = new google.maps.DirectionsService(); 
     var map; 

     function initialize() { 
      directionsDisplay = new google.maps.DirectionsRenderer(); 
      var chicago = new google.maps.LatLng(26.912417, 75.787288); 
      var mapOptions = { 
       zoom: 7, 
       mapTypeId: google.maps.MapTypeId.ROADMAP, 
       center: chicago 
      } 
      map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); 
      directionsDisplay.setMap(map); 

     } 

     function calcRoute() { 
      var start = document.getElementById("start").value; 
      var end = document.getElementById("end").value; 


      var waypts = []; 
      var checkboxArray = document.getElementById('waypoints'); 
      for(var i = 0; i < checkboxArray.length; i++) { 
       if(checkboxArray.options[i].selected == true) { 
        waypts.push({ 
         location: checkboxArray[i].value, 
         stopover: true 
        }); 
       } 
      } 


      var request = { 
       origin: start, 
       destination: end, 
       waypoints: waypts, 
       travelMode: google.maps.TravelMode.DRIVING 
      }; 
      directionsService.route(request, function(response, status) { 
       if(status == google.maps.DirectionsStatus.OK) { 
        directionsDisplay.setDirections(response); 
        var route = response.routes[0]; 
        // alert(route.legs[1].duration.text); 
        var summaryPanel = document.getElementById('directions_panel'); 
        summaryPanel.innerHTML = ''; 
        // For each route, display summary information. 
        for(var i = 0; i < route.legs.length; i++) { 
         var routeSegment = i + 1; 
         summaryPanel.innerHTML += '<b>Route Segment: ' + routeSegment + '</b><br>'; 
         summaryPanel.innerHTML += route.legs[i].start_address + ' to '; 
         summaryPanel.innerHTML += route.legs[i].end_address + '<br>'; 
         summaryPanel.innerHTML += route.legs[i].duration.text + '<br>'; 
         summaryPanel.innerHTML += route.legs[i].distance.text + '<br><br>'; 
        } 

       } 
      }); 
     } 

     google.maps.event.addDomListener(window, 'load', initialize); 

    </script> 
</head> 
<body> 
    <!-- <div id="map-canvas"></div>--> 
    <div> 
     <strong>Start: </strong> 
     <select id="start" onChange="calcRoute();"> 
      <option value="Jaipur">Jaipur</option> 
      <option value="jagatpura">jagatpura</option> 
      <option value="malviya nagar, Jaipur">Malviya Nagar</option> 
      <option value="khatu">Sikar</option> 
      <option value="Dausa">Dausa</option> 
      <option value="Luniawas">Luniyawas</option> 
      <option value="Karoli">Karoli</option> 
      <option value="Baran">Baran</option> 
      <option value="Sawai Madhopur">Sawai Madhopur</option> 
      <option value="Udaipur">Udaipur</option> 
      <option value="Bikaner">Bikaner</option> 
      <option value="Churu">Churu</option> 
     </select> 
     <strong>End: </strong> 
     <select id="end" onChange="calcRoute();"> 
      <option value="Jaipur">Jaipur</option> 
      <option value="bassi">bassi</option> 
      <option value="goner">goner</option> 
      <option value="Khaniya">Khaniya</option> 
      <option value="Luniawas">Luniyawas</option> 
      <option value="Ajmer">Ajmer</option> 
      <option value="Karoli">Karoli</option> 
      <option value="Baran">Baran</option> 
      <option value="Sawai Madhopur">Sawai Madhopur</option> 
      <option value="Udaipur">Udaipur</option> 
      <option value="Bikaner">Bikaner</option> 
      <option value="Churu">Churu</option> 
     </select> 
    </div> 

    <div> 
     <strong>Mode of Travel: </strong> 
     <select id="mode" onChange="calcRoute();"> 
      <option value="DRIVING">Driving</option> 
      <option value="WALKING">Walking</option> 
      <option value="BICYCLING">Bicycling</option> 
      <option value="TRANSIT">Transit</option> 
     </select> 

     <select multiple id="waypoints" onChange="calcRoute();"> 
      <option value="bassi">bassi</input> 
      <option value="chainpura">chainpura</input> 
      <option value="Kanauta">Kanauta</input> 
     </select> 

    </div> 

    <div id="map-canvas" style="float:left;width:70%; height:40%"></div> 

    <div id="directions_panel" style="margin:20px;background-color:#FFEE77;"></div> 

</body> 
</html> 
3

您可以通过使用容易获得:通过使用

距离:

directionsDisplay.directions.routes[0].legs[0].distance.text 

Du配给使用:

directionsDisplay.directions.routes[0].legs[0].duration.text 
+0

只有你有1条腿。从A点到B点。对于多条腿,您必须根据上面的@mpen答案对腿的数值进行求和,然后转换distance.value和duration.value秒的距离。 – 2016-10-31 20:32:44

相关问题