Маршруты общественного транспорта

Построение маршрутов общественного транспорта является одной из наиболее востребованных задач в геоинформационных веб-приложениях. HERE Maps API предоставляет инструменты для расчёта маршрутов с использованием автобусов, метро, трамваев, поездов пригородного сообщения, паромов и других видов общественного транспорта. Полученные данные позволяют отображать пользователю подробную последовательность пересадок, остановок, время отправления и прибытия, длительность поездки и дополнительные сведения о маршруте.

Архитектура маршрутизации общественного транспорта

В экосистеме HERE основную роль играет сервис Routing API. При построении маршрутов общественного транспорта запрос отправляется на сервер маршрутизации, который анализирует транспортную сеть выбранного региона и возвращает оптимальный маршрут.

Основные этапы работы:

  1. Определение начальной точки.
  2. Определение конечной точки.
  3. Выбор транспортного режима.
  4. Выполнение запроса к Routing API.
  5. Обработка полученного маршрута.
  6. Отображение маршрута на карте.

Схема взаимодействия выглядит следующим образом:

Пользователь
      ↓
JavaScript-приложение
      ↓
HERE Routing API
      ↓
Расчёт маршрута
      ↓
JSON-ответ
      ↓
Отображение на карте

Подключение необходимых модулей

Для работы с маршрутизацией необходимо подключить стандартные библиотеки HERE Maps.

<script src="https://js.api.here.com/v3/3.1/mapsjs-core.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-service.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-ui.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-mapevents.js"></script>

Инициализация платформы:

const platform = new H.service.Platform({
    apikey: 'YOUR_API_KEY'
});

Создание карты:

const defaultLayers = platform.createDefaultLayers();

const map = new H.Map(
    document.getElementById('map'),
    defaultLayers.vector.normal.map,
    {
        zoom: 12,
        center: {
            lat: 52.5200,
            lng: 13.4050
        }
    }
);

Добавление элементов управления:

const beh * avior = new H.mapevents.Behavior(
    new H.mapevents.MapEvents(map)
);

const ui = H.ui.UI.createDefault(map, defaultLayers);

Получение сервиса маршрутизации

Для построения маршрутов используется объект маршрутизатора.

const router = platform.getRoutingService(null, 8);

Версия 8 Routing API поддерживает современные возможности маршрутизации, включая общественный транспорт.


Формирование запроса на маршрут

Маршрут между двумя точками строится через передачу координат отправления и назначения.

Пример параметров:

const routingParameters = {
    transportMode: 'publicTransport',
    origin: '52.5200,13.4050',
    destination: '52.5170,13.3889',
    return: 'polyline,summary,actions,instructions'
};

Основные параметры:

Параметр Назначение
transportMode Тип транспорта
origin Точка отправления
destination Точка назначения
return Состав возвращаемых данных

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

Выполнение запроса:

router.calculateRoute(
    routingParameters,
    onSuccess,
    onError
);

Функция обработки успешного ответа:

function onSuccess(result) {
    console.log(result);
}

Обработка ошибки:

function onError(error) {
    console.error(error);
}

Структура ответа маршрута

Ответ содержит массив маршрутов.

Пример доступа:

const route = result.routes[0];

Каждый маршрут включает:

route.sections

Секции соответствуют отдельным этапам путешествия:

  • Пеший переход.
  • Автобус.
  • Метро.
  • Электричка.
  • Паром.
  • Пересадка.

Например:

route.sections.forEach(section => {
    console.log(section.transport.mode);
});

Возможный результат:

pedestrian
bus
pedestrian
subway
pedestrian

Анализ секций маршрута

Каждая секция содержит подробную информацию.

Пример:

const section = route.sections[0];

console.log(section.departure.place.location);
console.log(section.arrival.place.location);

Продолжительность:

console.log(section.summary.duration);

Расстояние:

console.log(section.summary.length);

Время отправления:

console.log(section.departure.time);

Время прибытия:

console.log(section.arrival.time);

Определение типа транспорта

Тип транспортного средства можно получить следующим образом:

console.log(section.transport.mode);

Возможные значения:

bus
subway
train
lightRail
tram
ferry
regionalTrain
pedestrian

Проверка:

if (section.transport.mode === 'subway') {
    console.log('Поездка на метро');
}

Информация о линии маршрута

Для транспортных сегментов доступна информация о линии.

console.log(section.transport.name);

Пример:

U2
Bus 100
Tram M4

Дополнительные данные:

console.log(section.transport.category);

Иногда доступны:

console.log(section.transport.headsign);

Направление движения:

Alexanderplatz

Отображение маршрута на карте

Routing API возвращает геометрию маршрута в виде полилинии.

Получение координат:

const linestring =
    H.geo.LineString.fromFlexiblePolyline(
        section.polyline
    );

Создание объекта маршрута:

const routeLine = new H.map.Polyline(
    linestring,
    {
        style: {
            lineWidth: 5
        }
    }
);

Добавление на карту:

map.addObject(routeLine);

Отображение всех секций

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

Отрисовка полного пути:

route.sections.forEach(section => {

    const linestring =
        H.geo.LineString.fromFlexiblePolyline(
            section.polyline
        );

    const polyline =
        new H.map.Polyline(linestring);

    map.addObject(polyline);

});

Использование различных цветов

Для улучшения восприятия рекомендуется выделять разные виды транспорта цветами.

function getColor(mode) {

    switch(mode) {

        case 'subway':
            return '#ff0000';

        case 'bus':
            return '#0077ff';

        case 'tram':
            return '#00aa00';

        case 'train':
            return '#ff8800';

        default:
            return '#555555';
    }

}

Использование:

const polyline =
    new H.map.Polyline(linestring, {
        style: {
            strokeColor:
                getColor(section.transport.mode),
            lineWidth: 6
        }
    });

Отображение остановок

Остановки содержатся в информации о секции.

Создание маркера:

const marker =
    new H.map.Marker({
        lat: section.departure.place.location.lat,
        lng: section.departure.place.location.lng
    });

map.addObject(marker);

Для конечной остановки:

const arrivalMarker =
    new H.map.Marker({
        lat: section.arrival.place.location.lat,
        lng: section.arrival.place.location.lng
    });

map.addObject(arrivalMarker);

Создание списка пересадок

Сведения о пересадках удобно выводить отдельно.

Пример формирования списка:

route.sections.forEach(section => {

    console.log(
        section.transport.mode
    );

    console.log(
        section.departure.place.name
    );

    console.log(
        section.arrival.place.name
    );

});

Результат:

Автобус 100
От: Hauptbahnhof
До: Alexanderplatz

Метро U2
От: Alexanderplatz
До: Potsdamer Platz

Получение времени поездки

Общее время маршрута:

const duration =
    route.sections.reduce(
        (total, section) =>
            total + section.summary.duration,
        0
    );

Перевод в минуты:

const minutes =
    Math.round(duration / 60);

Вывод:

console.log(minutes);

Работа с расписанием

Маршруты общественного транспорта учитывают реальные расписания.

В ответе доступны:

section.departure.time
section.arrival.time

Например:

2025-05-14T09:42:00+02:00

Преобразование:

const departure =
    new Date(
        section.departure.time
    );

console.log(
    departure.toLocaleTimeString()
);

Построение маршрута на определённое время

В запрос можно передать дату и время.

const routingParameters = {
    transportMode: 'publicTransport',
    origin: '52.5200,13.4050',
    destination: '52.5170,13.3889',
    departureTime:
        '2026-08-01T08:00:00',
    return:
        'polyline,summary,actions'
};

Расчёт будет выполнен с учётом расписания на указанный момент.


Поиск маршрута по времени прибытия

Иногда требуется прибыть к определённому времени.

const routingParameters = {
    transportMode: 'publicTransport',
    origin: '52.5200,13.4050',
    destination: '52.5170,13.3889',
    arrivalTime:
        '2026-08-01T09:00:00'
};

Алгоритм автоматически подберёт время отправления.


Ограничение количества пересадок

Для некоторых сценариев необходимо минимизировать число пересадок.

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

Полученный маршрут можно дополнительно фильтровать:

const transfers =
    route.sections.filter(
        section =>
            section.transport.mode !==
            'pedestrian'
    ).length - 1;

Проверка:

if (transfers <= 1) {
    console.log(
        'Не более одной пересадки'
    );
}

Отображение детальных инструкций

Каждая секция может содержать действия.

Получение инструкций:

section.actions.forEach(action => {

    console.log(
        action.instruction
    );

});

Пример:

Пройдите 120 метров
Поверните направо
Сядьте на автобус 100
Выйдите на остановке Alexanderplatz

Автоматическое масштабирование карты

После построения маршрута карта должна показывать весь путь.

const group =
    new H.map.Group();

Добавление объектов:

group.addObject(routeLine);

Масштабирование:

map.getViewModel().setLookAtData({
    bounds:
        group.getBoundingBox()
});

Построение альтернативных маршрутов

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

const routingParameters = {
    transportMode: 'publicTransport',
    alternatives: 3,
    origin: '52.5200,13.4050',
    destination: '52.5170,13.3889'
};

Обработка:

result.routes.forEach(route => {

    console.log(
        route.sections
    );

});

Каждый маршрут может отличаться:

  • количеством пересадок;
  • временем поездки;
  • расстоянием пеших переходов;
  • используемыми линиями транспорта.

Комбинированные маршруты

Общественный транспорт часто включает пешеходные сегменты.

Пример структуры:

Пешком
↓
Автобус
↓
Пешком
↓
Метро
↓
Пешком

Для каждого сегмента доступны собственные координаты, инструкции и временные характеристики.

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


Оптимизация производительности

При работе с большим количеством маршрутов рекомендуется:

  • хранить экземпляр router в единственном экземпляре;
  • переиспользовать объекты карты;
  • удалять старые полилинии перед построением нового маршрута;
  • группировать объекты через H.map.Group;
  • избегать лишних запросов при каждом вводе символа в поисковой строке;
  • использовать дебаунсинг запросов;
  • кэшировать результаты популярных маршрутов;
  • выполнять ленивую загрузку подробной информации только по требованию.

Практические сценарии использования

Планировщики поездок

Сервисы построения маршрутов по городу:

  • поиск оптимального пути;
  • выбор времени отправления;
  • отображение пересадок;
  • анализ альтернатив.

Корпоративные транспортные системы

Внутренние порталы компаний могут показывать:

  • способы добраться до офиса;
  • маршруты между филиалами;
  • расписание общественного транспорта рядом с объектами компании.

Туристические приложения

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

Городские информационные системы

Муниципальные сервисы позволяют анализировать транспортную доступность районов и визуализировать существующую транспортную инфраструктуру.

Мобильные навигационные приложения

Функциональность общественного транспорта часто объединяется с автомобильной навигацией, веломаршрутами и пешеходными маршрутами, образуя единую мультимодальную транспортную платформу на базе HERE Maps API.