@sgidlev

Как сравнить время маршрутов на автомобиле, общественном транспорте и пешком, и построить самый быстрый?

Помогите решить задачу: Необходимо сравнить маршруты между собой по времени в зависимости от вида транспорта (авто, общественный транспорт, пешком) и построить самый быстрый.

Основная проблема у меня как сравнить время маршрутов. Я использую метод
multiRoute.model.events
            .add("requestsuccess", function (event) {
            console.log("Найдено маршрутов: " + routes.length);
            for (var i = 0, l = routes.length; i < l; i++) {
                 console.log("Время маршрута в числовом выражении " + (i + 1) + ": " + routes[i].properties.get("durationInTraffic").value);
                    total_routes.push(routes[i].properties.get("durationInTraffic").value);
                 }
            })
            .add("requestfail", function (event) {
                console.log("Ошибка: " + event.get("error").message);
            });


И так прохожу по каждому маршруту, но данные в массив не записываются, т.е. я не могу в последствии сравнить значения и вывести один из них.

Может есть какой простой способ получить длину маршрута? Например console.log(multiRoute.getRoutes().get(0).properties.get("durationInTraffic").value);
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
@sgidlev Автор вопроса
Сделал вот так, думаю можно лучше, но не придумал как:
/* =========== Прокладываем самый быстрый маршрут до ближайшего магазина =========== */
    var routes_array = [];

    //Проходимся по каждому маршруту и добавляем их в массив routes_array
    var PromiseRoute = new Promise(function (resolve, reject) {
        var test;
        getRouteLength(startPoint, destPoint, 'auto').then(
            result => {
                console.log("Fulfilled: " + result);
                //routes_array.push(result);
                routes_array.push(result);
                resolve(routes_array);
            }
        );

    }).then(function (result) {
        console.log(result);
        return getRouteLength(startPoint, destPoint, 'masstransit').then(
            result => {
                console.log("Fulfilled: " + result);
                //routes_array.push(result);
                routes_array.push(result);
                return routes_array;
            }
        );
    }).then(function (result) {
        console.log(result);
        return getRouteLength(startPoint, destPoint, 'pedestrian').then(
            result => {
                console.log("Fulfilled: " + result);
                routes_array.push(result);
                return routes_array;
            }
        );
    });

    var FastestRouteTime,
        FastestRouteLength,
        FastestRouteTimeText,
        FastestRouteLengthText;

    //Смотрим обобщенный результат
    PromiseRoute.then(
        result => {
            FastestRoute = result[0].Route;
            FastestRouteTime = result[0].RouteTime;
            FastestRouteLength = result[0].RouteLength;
            FastestRouteTimeText = result[0].RouteTimeText;
            FastestRouteLengthText = result[0].RouteLengthText;


            for (var i = 0, l = result.length; i < l; i++) {
                //Ищем самый быстрый маршрут
                if (result[i].RouteTime > 0 && result[i].RouteTime < result[0].RouteTime) {
                    FastestRoute = result[i].Route;
                    FastestRouteTimeText = result[i].RouteTimeText;
                    FastestRouteLengthText = result[i].RouteLengthText;

                }
            }

            console.log('FastestRouteTime: ', FastestRouteTime);
            console.log('FastestRouteLength: ', FastestRouteLength);
            $('#route-time').html(FastestRouteTimeText);
            $('#route-length').html(FastestRouteLengthText);
            myMap.geoObjects.add(FastestRoute); //Добавляем самый быстрый маршрут
        }
    );
    /* =========== Прокладываем самый быстрый маршрут до ближайшего магазина =========== */


    /* =========== Функция для поиска самого быстрого маршрута до ближайшего магазина  =========== */
    function getRouteLength(startPoint, destPoint, rMode) {
        multiRoute = new ymaps.multiRouter.MultiRoute({
            referencePoints: [
                startPoint,
                destPoint
            ],
            params: {
                routingMode: rMode,
                avoidTrafficJams: true,
                results: 1,
            }
        }, {
               // Автоматически устанавливать границы карты так, чтобы маршрут был виден целиком.
                boundsAutoApply: true
            });

        return new Promise(function (resolve, reject) {
            multiRoute.model.events.add("requestsuccess", function () {
                var routes = multiRoute.model.getRoutes();
                var minLength = -1;
                var routeLength = -1;
                var routeTime = -1;
                var routeLengthText;
                var routeTimeText;

                for (var i = 0, l = routes.length; i < l; i++) {
                    //let routeLength =  multiRoute.model.getRoutes().properties.get('distance').value / 1000;
                    routeLength = routes[i].properties.get("distance").value;
                    routeLengthText = routes[i].properties.get("distance").text;
                    routeTime = routes[i].properties.get("durationInTraffic").value;
                    routeTimeText = routes[i].properties.get("durationInTraffic").text;
                    if (minLength < 0 || routeLength < minLength) {
                        minLength = routeLength;
                    }
                    console.log("Длина маршрута " + (i + 1) + ": " + routes[i].properties.get("distance").text);
                    console.log(routeLengthText);
                    console.log("Время маршрута " + (i + 1) + ": " + routes[i].properties.get("durationInTraffic").text);
                    console.log(routeTimeText);
                }
                resolve({
                    Route: multiRoute,
                    RouteTime: routeTime,
                    RouteLength: routeLength,
                    RouteLengthText: routeLengthText,
                    RouteTimeText: routeTimeText,
                });
            });
        });
    }

    /* =========== ! Функция для поиска самого быстрого маршрута до ближайшего магазина  =========== */
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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