Программная работа с маршрутами

Общие сведения

Класс multiRouter.MultiRoute позволяет строить составные маршруты — маршруты по трем точкам и более. С помощью этого класса можно получать информацию о маршруте, изменять внешний вид и переставлять точки маршрута. Подробнее о настройках маршрута

Внимание. Запросы к маршрутизации тарифицируются.

Построение маршрута на карте

Чтобы построить маршрут с помощью класса multiRouter.MultiRoute, создайте экземпляр этого класса и добавьте его на карту:

// Построение маршрута.
// По умолчанию строится автомобильный маршрут.
var multiRoute = new ymaps.multiRouter.MultiRoute({   
    // Точки маршрута. Точки могут быть заданы как координатами, так и адресом. 
    referencePoints: [
        'Москва, метро Смоленская',
        'Москва, метро Арбатская',
        [55.734876, 37.59308], // улица Льва Толстого.
    ]
}, {
      // Автоматически устанавливать границы карты так,
      // чтобы маршрут был виден целиком.
      boundsAutoApply: true
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
 
    // Создание экземпляра маршрута.
    var multiRoute = new ymaps.multiRouter.MultiRoute({   
        // Точки маршрута.
        // Обязательное поле. 
        referencePoints: [
            'Москва, метро Смоленская',
            'Москва, метро Арбатская',
            [55.734876, 37.59308], // улица Льва Толстого.
        ]
    }, {
      // Автоматически устанавливать границы карты так,
      // чтобы маршрут был виден целиком.
      boundsAutoApply: true
});

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});
</script>
Внимание. Для точек, которые задаются в виде строки, будут отправляться дополнительные запросы в Геокодер. При этом каждая точка — это отдельный запрос. Кроме того, включение опции reverseGeocoding также приведет к дополнительным запросам в Геокодер. Следует иметь в виду, что запросы на геокодирование тарифицируются.

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

Настройки маршрута

Маршруту можно задать различные настройки. Например, переключить тип маршрутизации, изменить внешний вид или переставить точки местами.

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

В разделе Решение типовых задач приведены решения других распространенных задач.

Выбор типа маршрутизации

Тип маршрутизации задается в параметре routingMode. Доступны следующие типы маршрутизации:
  • "auto" (по умолчанию) — на автомобиле;
  • "masstransit" — на общественном транспорте;
  • "pedestrian" — пешеходный маршрут;
  • "bicycle" — маршрут на велосипеде.

Пример:

// Построение маршрута на общественном транспорте.

// Создание экземпляра маршрута.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        'метро Смоленская',
        'метро Арбатская'
    ],
    params: {
      // Тип маршрута: на общественном транспорте.
      routingMode: "masstransit"  
    }
}, {
      // Автоматически устанавливать границы карты так,
      // чтобы маршрут был виден целиком.
      boundsAutoApply: true
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    // Построение маршрута на общественном транспорте.
    
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    
    // Создание экземпляра маршрута.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            'метро Смоленская',
            'метро Арбатская'
        ],
        params: {
            // Тип маршрута: на общественном транспорте.
            routingMode: "masstransit"  
        }
    }, {
        // Автоматически устанавливать границы карты так,
        // чтобы маршрут был виден целиком.
        boundsAutoApply: true
    });

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>

Изменить тип маршрутизации можно также после того, как маршрут был построен:

// Второй способ изменить тип маршрутизации: через метод setParams().
multiRoute.model.setParams({
    routingMode: 'bicycle'
});

При изменении параметра routingMode маршрут будет перестроен.

Построение маршрута с учетом пробок

Чтобы построить маршрут с учетом пробок, нужно задать параметр avoidTrafficJams: true.

// Построение маршрута с учетом пробок.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        "Москва, Парк Победы",
        "Москва, Лосиный остров"
    ],
    params: {
        avoidTrafficJams: true
    }
}, {
        // Автоматически устанавливать границы карты так,
        // чтобы маршрут был виден целиком.
        boundsAutoApply: true
    });

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    // Построение маршрута с учетом пробок.

    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            "Москва, Парк Победы",
            "Москва, Лосиный остров"
        ],
        params: {
            avoidTrafficJams: true
        }
    }, {
        // Автоматически устанавливать границы карты так,
        // чтобы маршрут был виден целиком.
        boundsAutoApply: true
    });

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>

Включить/выключить учет пробок можно также после того, как маршрут был добавлен на карту:

// Выключение учета пробок через метод setParams().
multiRoute.model.setParams({
    avoidTrafficJams: false
});
При изменении параметра avoidTrafficJams маршрут будет перестроен.

В песочнице приведен интерактивный пример, в котором учет пробок включается/выключается по кнопке.

Добавление транзитных точек

Транзитные точки задаются через параметр viaIndexes. Например:
// Создание маршрута по трем точкам.
// Вторая точка будет транзитной.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
      'метро Парк Культуры',
      'метро Смоленская',
      'метро Арбатская'
    ],
    params: {
      // Установим вторую точку маршрута ('метро Смоленская')
      // в качестве транзитной.
      viaIndexes: [1]
    }
}, {
    boundsAutoApply: true
});
// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    
    // Создание маршрута по трем точкам.
    // Вторая точка будет транзитной.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            'метро Парк Культуры',
            'метро Смоленская',
            'метро Арбатская'
        ],
        params: {
            // Установим вторую точку маршрута ('метро Смоленская')
            // в качестве транзитной.
            viaIndexes: [1]
        }
    }, {
        boundsAutoApply: true
    });

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>
Примечание. Транзитные точки доступны только для автомобильных маршрутов.

Настройка внешнего вида маршрута

Внешний вид маршрута можно изменить при его создании, через конструктор. Опции отображения передаются конструктору вторым аргументом:

// Создание маршрута.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        [55.734470, 37.58000],
        [55.734336, 37.51218],
        [55.724102, 37.19912]
    ]
}, {
    // Внешний вид путевых точек.
    wayPointStartIconColor: "#FFFFFF",
    wayPointStartIconFillColor: "#B3B3B3",
    // Внешний вид линии активного маршрута.
    routeActiveStrokeWidth: 8,
    routeActiveStrokeStyle: 'solid',
    routeActiveStrokeColor: "#002233",
    // Внешний вид линий альтернативных маршрутов.
    routeStrokeStyle: 'dot',
    routeStrokeWidth: 3,
    boundsAutoApply: true
});
// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {  
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    
    // Создание маршрута.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            [55.734470, 37.58000],
            [55.734336, 37.51218],
            [55.724102, 37.19912]
        ]
    }, {
        // Внешний вид путевых точек.
        wayPointStartIconColor: "#FFFFFF",
        wayPointStartIconFillColor: "#B3B3B3",
        // Внешний вид линии активного маршрута.
        routeActiveStrokeWidth: 8,
        routeActiveStrokeStyle: 'solid',
        routeActiveStrokeColor: "#002233",
        // Внешний вид линий альтернативных маршрутов.
        routeStrokeStyle: 'dot',
        routeStrokeWidth: 3,
        boundsAutoApply: true
    });

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>

Включение режима редактирования

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

Включить режим редактирования можно с помощью метода start():

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        "Москва, метро Сокол",
        "Москва, метро Павелецкая"
    ]
});
// Включение режима редактирования.
multiRoute.editor.start();
// А вот так можно отключить режим редактирования.
// multiRoute.editor.stop();

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {  
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            "Москва, метро Сокол",
            "Москва, метро Павелецкая"
        ]
    });

    // Включение режима редактирования.
    multiRoute.editor.start();
    // А вот так можно отключить режим редактирования.
    // multiRoute.editor.stop();
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>

Режим редактирования с добавлением новых точек

По умолчанию режим редактирования не позволяет создавать новые точки и удалять уже существующие. Чтобы включить эту возможность, нужно указать специальные опции:

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        "Москва, метро Сокол",
        "Москва, метро Павелецкая"
    ]
}, {
    // Опция editorDrawOver запрещает ставить точки поверх объектов карты
    // (в режиме добавления новых точек). Это нужно для того,
    // чтобы пользователи могли создавать промежуточные
    // точки по линии маршрута.
    editorDrawOver: false,
    // Опция editorMidPointsType задает тип промежуточных точек,
    // которые будут создаваться на маршруте.
    // "via" - будут создаваться транзитные точки;
    // "way" - путевые точки.
    editorMidPointsType: "via"
});

// Включение режима редактирования и задание его настроек.
multiRoute.editor.start({
    // При включении опции addWayPoints пользователи смогут создавать
    // путевые точки по клику на карте.
    addWayPoints: true,
    // При включении опции removeWayPoints пользователи смогут удалять
    // путевые точки. 
    // Для удаления точки нужно дважды кликнуть по ней.
    removeWayPoints: true,
    // При включении опции addMidPoints пользователи смогут создавать
    // новые промежуточные точки.
    // Чтобы создать промежуточную точку, нужно кликнуть по линии маршрута и,
    // удерживая кнопку, переместить точку в нужную позицию на карте.
    // Тип промежуточной точки (путевая или транзитная) задается в опции 
    // editorMidPointsType.
    addMidPoints: true
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {  
    var myMap = new ymaps.Map('map', {
        center: [55.751574, 37.573856],
        zoom: 9,
        controls: []
    });
    
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            "Москва, метро Сокол",
            "Москва, метро Павелецкая"
        ]
    }, {
        // Опция editorDrawOver запрещает ставить точки поверх объектов карты.
        // Это нужно для того, чтобы пользователи могли
        // создавать промежуточные точки.
        editorDrawOver: false,
        // Опция editorMidPointsType задает тип промежуточных точек,
        // которые будут создаваться на маршруте.
        // "via" - будут создаваться транзитные точки;
        // "way" - путевые точки.
        editorMidPointsType: "via"
    });

    // Включение режима редактирования и задание его настроек.
    multiRoute.editor.start({
        // При включении опции addWayPoints пользователи смогут создавать
        // путевые точки по клику на карте.
       addWayPoints: true,
       // При включении опции removeWayPoints пользователи смогут удалять
       // путевые точки. 
       // Для удаления точки нужно дважды кликнуть по ней.
       removeWayPoints: true,
       // При включении опции addMidPoints пользователи смогут создавать
       // новые промежуточные точки.
       // Чтобы создать промежуточную точку, нужно кликнуть по линии маршрута и,
       // удерживая кнопку, переместить точку в нужную позицию на карте.
       // Тип промежуточной точки (путевая или транзитная) задается в опции 
       // editorMidPointsType
       addMidPoints: true
   });
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);
});   
</script>

В песочнице приведен интерактивный пример, в котором режим редактирования включается по кнопке.

Получение информации о маршруте

Объект multiRouter.MultiRoute содержит информацию о построенных маршрутах. Например, протяженность и время преодоления, а также информацию о перекрытых участках на автомобильном маршруте.

Список всех операций с маршрутом приведен в справочнике.

Как получить информацию об активном маршруте

Чтобы получить ссылку на активный маршрут, нужно воспользоваться методом getActiveRoute(). В зависимости от того, какой тип маршрутизации используется, маршрут описывается объектом:

Ниже приведен пример получения активного маршрута:

// Подписка на событие обновления данных маршрута.
// Подробнее о событии в справочнике.
// Обратите внимание, подписка осуществляется для поля model.
multiRoute.model.events.add('requestsuccess', function() {
    // Получение ссылки на активный маршрут.
    var activeRoute = multiRoute.getActiveRoute();
    // Вывод информации о маршруте.
    console.log("Длина: " + activeRoute.properties.get("distance").text);
    console.log("Время прохождения: " + activeRoute.properties.get("duration").text);
    // Для автомобильных маршрутов можно вывести 
    // информацию о перекрытых участках.
    if (activeRoute.properties.get("blocked")) {
        console.log("На маршруте имеются участки с перекрытыми дорогами.");
    }
});
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.753994, 37.622093],
        zoom: 9,
        controls: []
    });

    // Создание маршрута.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            [55.734876, 37.59308],
            [55.761184, 37.57850]
        ]
    }, {
        boundsAutoApply: true
    });

    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);

    // Подписка на событие обновления данных маршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Получение ссылки на активный маршрут.
        // В примере используется автомобильный маршрут,
        // поэтому метод getActiveRoute() вернет объект multiRouter.driving.Route.
        var activeRoute = multiRoute.getActiveRoute();
        // Вывод информации о маршруте.
        console.log("Длина: " + activeRoute.properties.get("distance").text);
        console.log("Время прохождения: " + activeRoute.properties.get("duration").text);
        // Для автомобильных маршрутов можно вывести 
        // информацию о перекрытых участках.
        if (activeRoute.properties.get("blocked")) {
            console.log("На маршруте имеются участки с перекрытыми дорогами.");
        }
    }); 
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);   
}); 
</script>  

Как получить пути маршрута

Путь — участок маршрута между точками, в которых нужно сделать остановку.

Пути маршрута на рисунке:
  • Первый путь: между точками «A» и «B»;
  • Второй путь: между точками «B» и «C».

Получить список путей можно с помощью метода getPaths(). В зависимости от типа маршрутизации, каждый путь маршрута описывается объектом:

Ниже приведен пример получения путей маршрута:

// Получение коллекции путей активного маршрута.
// activeRoute - это объект, описывающий активный маршрут.
// Он был получен ранее (см. пример).
var activeRoutePaths = activeRoute.getPaths();    
// Проход по коллекции путей.
activeRoutePaths.each(function(path) {
    console.log("Длина пути: " + path.properties.get("distance").text);
    console.log("Время прохождения пути: " + path.properties.get("duration").text);
}); 
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map("map", {
        center: [55.753994, 37.622093],
        zoom: 9,
        controls: []
    });

    // Построение маршрута.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            [55.734876, 37.59308],
            [55.761184, 37.57850],
            [55.762492, 37.58950]
        ]
    });
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);

    // Подписка на событие готовности маршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Получение ссылки на активный маршрут.
        var activeRoute = multiRoute.getActiveRoute();
        // Получение коллекции путей активного маршрута.
        var activeRoutePaths = activeRoute.getPaths(); 
        // Проход по коллекции путей.
        activeRoutePaths.each(function(path) {
            console.log("Длина пути: " + path.properties.get("distance").text);
            console.log("Время прохождения пути: " + path.properties.get("duration").text);
        });
    }); 
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);    
});   
</script>

Как получить информацию о сегментах маршрута

Каждый маршрут разбивается на сегменты. Сегменты — это участки между:
  • путевыми/транзитными точками;
  • точками возможного изменения направления движения (развилка, въезд, съезд, поворот, разворот, перекресток);
  • точками, в которых меняется тип участка. Например, сегмент «пешком» меняется на сегмент «на автобусе».

На рисунке ниже сегмент обозначен синим цветом.

Чтобы получить список сегментов, нужно воспользоваться методом getSegments(). В зависимости от типа маршрутизации, каждый сегмент описывается объектом:

Ниже приведен пример получения сегментов маршрута:

// Сначала нужно получить коллекцию путей маршрута.
// Примечание: объект activeRoute был получен ранее (см. пример).
var activeRoutePaths = activeRoute.getPaths(); 
// Проход по коллекции путей.
activeRoutePaths.each(function(path) {
  // Получение коллекции сегментов для каждого пути.
  var segments = path.getSegments();
  // Проход по коллекции сегментов и вывод информации о каждом сегменте.
  segments.each(function(segment) {
    console.log("Маневр в конце сегмента: " + segment.properties.get("action").text);
    console.log("Длина сегмента: " + segment.properties.get("distance").text);
    console.log("Время прохождения сегмента: " + segment.properties.get("duration").text);
    console.log("По какой улице проходит сегмент: " + segment.properties.get("street"));
  }); 
});   
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.753994, 37.622093],
        zoom: 9,
       controls: []
    });
    // Построим мультимаршрут.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            [55.734876, 37.59308],
            [55.761184, 37.57850]
        ]
    });

    // Отобразим мультимаршрут на карте.
    myMap.geoObjects.add(multiRoute);

    // Подпишемся на событие построения мультимаршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Получение информации об активном маршруте.
        var activeRoute = multiRoute.getActiveRoute();
        // Получение коллекции путей маршрута.
        var activeRoutePaths = activeRoute.getPaths(); 
        // Проход по коллекции путей
        // активного маршрута.
        activeRoutePaths.each(function(path) {
            // Путь автомобильного маршрута - это
            // объект multiRouter.driving.Path.
            // Получение коллекции сегментов в пути.
            var segments = path.getSegments(); 
            // Проход по коллекции сегментов и вывод
            // информации о каждом сегменте.
            segments.each(function(segment) {
                // Вывод информации о сегменте.
                console.log("Маневр в конце сегмента: " + segment.properties.get("action").text);
                console.log("Длина сегмента: " + segment.properties.get("distance").text);
                console.log("Время прохождения сегмента: " + segment.properties.get("duration").text);
                console.log("По какой улице проходит сегмент: " + segment.properties.get("street"));
            });
        });
    }); 
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);   
});   
</script>

В песочнице приведены интерактивные примеры:

Как получить путевые точки маршрута

Путевая точка — точка маршрута, в которой нужно сделать остановку. Начальная и конечная точки также являются путевыми точками.

Путевые точки на рисунке: «A», «B» и «C».

Путевые точки описываются объектом multiRouter.WayPoint. Чтобы получить список путевых точек маршрута, нужно воспользоваться методом getWayPoints().

var wayPoints = multiRoute.getWayPoints();  

// Проход по коллекции путевых точек.
// Для каждой точки зададим содержимое меток.
wayPoints.each(function (point) {   
    point.options.set({
        preset: "islands#redStretchyIcon",
        // В качестве содержимого метки установим адрес точки маршрута.
        iconContentLayout: ymaps.templateLayoutFactory.createClass('{{ properties.request|raw }}')
    });
});    
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.753994, 37.622093],
        zoom: 9,
        controls: []
    });
    
    // Построим мультимаршрут.
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            'Москва, ул. Льва Толстого 16',
            'Москва, метро Третьяковская'
        ]
    });

    // Отобразим мультимаршрут на карте.
    myMap.geoObjects.add(multiRoute);

    // Подпишемся на событие построения мультимаршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Коллекция путевых точек маршрута.
        var wayPoints = multiRoute.getWayPoints();

        // Проход по коллекции путевых точек.
        // Для каждой точки зададим содержимое меток.
        wayPoints.each(function (point) {   
            point.options.set({
                preset: "islands#redStretchyIcon",
                iconContentLayout: ymaps.templateLayoutFactory.createClass('{{ properties.request|raw }}')
            });
        });
    }); 
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);    
});  
</script>

Как получить транзитные точки маршрута

Транзитная точка — точка, через которую нужно проложить маршрут, но в которой не подразумевается остановка. Транзитные точки поддерживаются только для автомобильной маршрутизации.

Транзитные точки описываются объектом multiRouter.ViaPoint. Чтобы получить транзитные точки маршрута, нужно использовать метод getViaPoints().

Пример ниже демонстрирует, как получить информацию о транзитных точках, а также задать для них отображение.

var viaPoints = multiRoute.getViaPoints();
// Проход по коллекции транзитных точек.
viaPoints.each(function (point) { 
    // Для каждой транзитной точки зададим ее отображение.
    point.options.set({  
        iconRadius: 7,
        iconFillColor: "#000088",
        // Внешний вид транзитной точки для активного маршрута.
        activeIconFillColor: "#E63E92"
    }); 
});
Посмотреть полный код примера
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>

<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
        center: [55.753994, 37.622093],
        zoom: 9,
        controls: []
    });
    var multiRoute = new ymaps.multiRouter.MultiRoute({
        referencePoints: [
            'метро Парк Культуры',
            'метро Смоленская',
            'метро Арбатская'
        ],
        params: {
            // Установим вторую точку маршрута ('метро Смоленская')
            // в качестве транзитной.
            viaIndexes: [1]
       }
    }, {
        boundsAutoApply: true
    });

    // Подпишемся на событие готовности мультимаршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Коллекция транзитных точек маршрута.
        var viaPoints = multiRoute.getViaPoints();
        // Проход по коллекции транзитных точек.
        viaPoints.each(function (point) { 
            // Для каждой транзитной точки зададим ее отображение.
            point.options.set({  
                iconRadius: 7,
                iconFillColor: "#000088",
                // Внешний вид транзитной точки для активного маршрута.
                activeIconFillColor: "#E63E92"
            }); 
        });
    });
    // Добавление маршрута на карту.
    myMap.geoObjects.add(multiRoute);   
});
</script>

В песочнице можно посмотреть более подробный пример — Настройка отображения мультимаршрута.

Решение типовых задач

Как показать адрес в подписях меток?

Если точки маршрута задаются адресом, этот адрес будет показываться в подписях к точкам автоматически.

Если точки маршрута задаются координатами, то чтобы на карте подписывался их адрес, следует выставить параметр reverseGeocoding в true.

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
      [55.734876, 37.59308],
      [55.761184, 37.57850]
    ],
    params: {
      reverseGeocoding: true
    }
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Примечание. Опция reverseGeocoding — это флаг, разрешающий API выполнять обратное геокодирование. Это означает, что для точек, которые задаются координатами, API будет отправлять запросы Геокодеру, чтобы определить адрес этих точек. Следует иметь в виду, что запросы к Геокодеру тарифицируются. При включении опции reverseGeocoding учитывайте нагрузку на ваш сайт, чтобы избежать превышения суточного лимита.
Как скрыть подписи у меток?

Чтобы для меток не показывались подписи с адресом, точки маршрута должны быть заданы координатами. При этом параметр reverseGeocoding должен быть выставлен в false.

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
      [55.734876, 37.59308],
      [55.761184, 37.57850]
    ],
    params: {
      reverseGeocoding: false
    }
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Как задать собственное изображение для меток?

Задать собственное изображение для меток можно через опции маршрута. Обратите внимание, что для путевых точек нужно указывать префикс 'wayPoint'.

var multiRoute = new ymaps.multiRouter.MultiRoute({
  referencePoints: [
    "Москва, Ленинский проспект",
    "Москва, Льва Толстого, 16",
    "Москва, парк Сокольники"
  ]
}, {
  // Задаем собственную картинку
  // для конечной точки.
  wayPointFinishIconLayout: "default#image",
  wayPointFinishIconImageHref: "images/img.png",
  wayPointFinishIconImageSize: [30, 30],
  wayPointFinishIconImageOffset: [-15, -15]
 });

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);

Открыть пример в песочнице

Нужно изменять внешний вид маршрута при наведении на него указателя мыши. Как это сделать?

Пример ниже показывает, как изменить цвет линии маршрута при наведении на него указателя мыши. Активный маршрут окрашивается в черный цвет, альтернативные маршруты — в белый.

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
      [55.734470, 37.58000],
      [55.734336, 37.51218],
      [55.724102, 37.19912]
    ]
}, {
    boundsAutoApply: true
});

// Подпишемся на событие готовности отображения маршрута.
multiRoute.events.add('update', function() {
    // Получение списка построенных маршрутов.
    var routes = multiRoute.getRoutes();
    // Проход по коллекции маршрутов.
    // Для каждого маршрута подпишемся на события
    // 'mouseenter' и 'mouseleave'.
    routes.each(function(route) {
        route.events.add('mouseenter', function() {
           // Получение ссылки на активный маршрут.
           var active = multiRoute.getActiveRoute();
            route.options.set('strokeWidth', 10);
            // Активный маршрут будет перекрашиваться в черный цвет.
            if (active === route) {
                route.options.set('strokeColor', "#000000");
            } else {
                route.options.set('strokeColor', "#FFFFFF");
            }
        });
        route.events.add('mouseleave', function() {
            route.options.unset('strokeWidth');
            route.options.unset('strokeColor');
        });
    });  
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);  

Как задать собственный макет балуна маршрута?
Как сделать, чтобы при каждом изменении маршрута границы карты автоматически перестраивались?

Для этого следует подписаться на событие маршрута 'boundschange'. В обработчике события нужно выставить опцию checkZoomRange в true.

multiRoute.events.add("boundschange", function() {
    myMap.setBounds(multiRoute.getBounds(), {
        checkZoomRange: true
    });
});
Примечание. Установить автоматическое центрирование карты также можно через опцию boundsAutoApply. Однако эта опция позволяет центрировать карту только при первом построении маршрута.
Как убрать метки над путевыми точками?

Первый способ: с помощью опции wayPointVisible:

var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
      [55.734876, 37.59308],
      [55.761184, 37.57850]
    ]
}, {
    wayPointVisible: false,
    boundsAutoApply: true
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);

Однако в этом случае точки маршрута будут неактивными, и пользователи не смогут их двигать.

Второй способ: задать собственное изображение для метки, которое будет менее заметным. Пример задания собственного изображения:

// Создание маршрута.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        "Москва, Ленинский проспект",
        "Москва, Льва Толстого, 16",
        "Москва, метро Водный стадион"
    ]
}, {
    // Задание внешнего вида начальной точки.
    wayPointStartIconLayout: "default#image",
    wayPointStartIconImageHref: "images/myImageStart.png",
    wayPointStartIconImageSize: [10, 10],
    wayPointStartIconImageOffset: [-5, -5],
    // Задание внешнего вида конечной точки.
    wayPointFinishIconLayout: "default#image",
    wayPointFinishIconImageHref: "images/myImageFinish.png",
    wayPointFinishIconImageSize: [10, 10],
    wayPointFinishIconImageOffset: [-5, -5],
    // Задание внешнего вида промежуточной путевой точки.
    wayPointIconLayout: "default#image",
    wayPointIconImageHref: "images/myImageWayPoint.png",
    wayPointIconImageSize: [10, 10],
    wayPointIconImageOffset: [-5, -5],
    boundsAutoApply: true
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
Как получить информацию о времени и длине маршрута?

См. пример в песочнице.

Как получить информацию о сегментах маршрута на общественном транспорте?
// Построим маршрут по трем точкам.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    // Описание опорных точек мультимаршрута.
    referencePoints: [
        [55.734876, 37.59308],
        "Москва, Мытищи"
    ],
    params: {
        routingMode: "masstransit"
    }
});

// Отобразим маршрут на карте.
myMap.geoObjects.add(multiRoute);

multiRoute.events.add('update', function() {
    // Получение активного маршрута.
    var activeRoute = multiRoute.getActiveRoute();
    // Получение путей активного маршрута.
    var activeRoutePaths = activeRoute.getPaths();
    
    // Проход по коллекции путей маршрута.
    activeRoutePaths.each(function(path) {
        // Получение сегментов маршрута.
        var segments = path.getSegments();
        // Проход по коллекции сегментов маршрута.
        segments.each(function(segment) {
            // Тип сегмента (пеший или на транспорте).
            var segmentType = segment.properties.get("type");
            // Получение всех сегментов "На транспорте".
            var segmentTransports = segment.properties.get('transports');
            if (segmentTransports != undefined) {
                segmentTransports.forEach(function(transport) {
                    console.log("Направление или номер маршрута: " + transport.name);
                    console.log("Тип транспорта: " + transport.type);
                    console.log("Цвет: " + transport.Style); // Цвет линии метро.
                });
            }
        });
    });
});

В песочнице приведен другой пример — Работа с данными и событиями мультимаршрута. В примере в зависимости от типа участка (на автобусе или на метро) сегменты маршрута окрашиваются в разный цвет.

Как посчитать количество пересадок на метро?
var multiRoute = new ymaps.multiRouter.MultiRoute({
    // Описание опорных точек мультимаршрута.
    referencePoints: [
        "Москва, метро Парк Победы",
        "Москва, метро Бабушкинская"
    ],
    params: {
        routingMode: "masstransit"
    }
});

// Отобразим маршрут на карте.
myMap.geoObjects.add(multiRoute);

multiRoute.events.add('update', function() {
    var activeRoute = multiRoute.getActiveRoute();
    // Время прохождения маршрута.
    var activeRouteDuration = activeRoute.properties.get("duration").text;
    // Получение путей маршрута.
    var activeRoutePaths = activeRoute.getPaths();
    
    var transferCount = 0;

    activeRoutePaths.each(function(path) {
        var segments = path.getSegments(); 
        segments.each(function (segment) {
            var segmentType = segment.properties.get("type");
            // Если тип сегмента - пересадка, то увеличиваем счетчик.
            if (segmentType == "transfer") {
                transferCount += 1;
            }
        });   
    });
    console.log("Количество пересадок на метро: " + transferCount); 
    console.log("Длительность маршрута: " + activeRouteDuration); 
});
Как программно редактировать маршрут (добавить/удалить точки, изменить тип маршрутизации и т. д.)?

Программно отредактировать маршрут можно через поле multiRoute.model:

// Создание экземпляра маршрута.
var multiRoute = new ymaps.multiRouter.MultiRoute({
    referencePoints: [
        'метро Арбатская', 
        'метро Смоленская'               
    ]
});

// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);

// Перестроение маршрута по новым точкам. 
// Точка 'метро Арбатская' будет удалена из маршрута.
multiRoute.model.setReferencePoints([ 
    'метро Смоленская',
    'метро Текстильщики'
]);

// Изменение параметров маршрутизации.
multiRoute.model.setParams({
    routingMode: 'masstransit'
});