An elegant way to find shortest and fastest route in Google Maps API v3?

后端 未结 6 858
耶瑟儿~
耶瑟儿~ 2020-12-03 03:46

I am making a taxi fare calculator. One of the business requirements is that, the company wants the shortest and fastest route options. I know Google directionService by def

6条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-03 04:34

    To obtain the shortest route from A to B I would suggest to make different queries with the “alternatives=true” parameter, playing with the “avoid” parameter between avoid=toll, avoid=highways, and then I would compare all results to pick the shortest route.

     directionsService = new google.maps.DirectionsService;
    //avoiding tolls
                directionsService.route({
                    origin: {
                        'placeId': originId
                    },
                    destination: {
                        'placeId': destinationId
                    },
                    provideRouteAlternatives: true,
                    avoidTolls: true,
                    travelMode: google.maps.TravelMode.DRIVING
                }, function(response, status) {
                    if (status === google.maps.DirectionsStatus.OK) {
                        routesResponses.push(response);
                    }
                    else {
                        window.alert('Directions request failed due to ' + status);
                    }
                });
                //avoiding highways
                directionsService.route({
                    origin: {
                        'placeId': originId
                    },
                    destination: {
                        'placeId': destinationId
                    },
                    provideRouteAlternatives: true,
                    avoidHighways: true,
                    travelMode: google.maps.TravelMode.DRIVING
                }, function(response, status) {
                    if (status === google.maps.DirectionsStatus.OK) {
                        routesResponses.push(response);
                    }
                    else {
                        window.alert('Directions request failed due to ' + status);
                    }
    
                    //Results analysis and drawing of routes
                    var fastest = Number.MAX_VALUE,
                        shortest = Number.MAX_VALUE;
    
                    routesResponses.forEach(function(res) {
                        res.routes.forEach(function(rou, index) {
                            console.log("distance of route " +index+": " , rou.legs[0].distance.value);
                            console.log("duration of route " +index+": " , rou.legs[0].duration.value);
                            if (rou.legs[0].distance.value < shortest) shortest = rou.legs[0].distance.value  ;
                            if (rou.legs[0].duration.value < fastest) fastest = rou.legs[0].duration.value  ;
    
                        })
                    })
                    console.log("shortest: ", shortest);
                    console.log("fastest: ", fastest);
    //painting the routes in green blue and red
                     routesResponses.forEach(function(res) {
                        res.routes.forEach(function(rou, index) {
                            new google.maps.DirectionsRenderer({
                                map:map,
                                directions:res,
                                routeIndex:index,
                                polylineOptions:{
                                    strokeColor: rou.legs[0].duration.value == fastest? "red":rou.legs[0].distance.value == shortest?"darkgreen":"blue",
                                    strokeOpacity: rou.legs[0].duration.value == fastest? 0.8:rou.legs[0].distance.value == shortest? 0.9: 0.5,
                                    strokeWeight: rou.legs[0].duration.value == fastest? 9:rou.legs[0].distance.value == shortest? 8: 3,
                                }
                            })
                        })
                    })   
                });
            }
    
        }
    

提交回复
热议问题