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

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

Подключение модулей маршрутизации

Для работы с общественным транспортом требуется подключение стандартных библиотек 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 router = platform.getRoutingService(null, 8);

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


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

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

const params = {
    transportMode: 'publicTransport',
    origin: '52.53086,13.38469',
    destination: '52.52064,13.40978',
    return: 'summary,polyline,actions,instructions'
};

router.calculateRoute(
    params,
    result => {
        console.log(result);
    },
    error => {
        console.error(error);
    }
);

После выполнения запроса API возвращает один или несколько вариантов поездки.

Типичный результат содержит:

  • общее время поездки;
  • количество пересадок;
  • расстояние;
  • список этапов маршрута;
  • геометрию пути;
  • инструкции для пассажира.

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

Основные данные находятся внутри массива маршрутов.

const route = result.routes[0];

Каждый маршрут состоит из секций.

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

Пример возможных типов:

Тип Описание
pedestrian Пеший участок
transit Поездка на транспорте
vehicle Перемещение на транспортном средстве
privateBus Частный автобус
train Железнодорожный транспорт

На практике маршрут может выглядеть следующим образом:

  1. Пешком до остановки.
  2. Автобус.
  3. Пересадка.
  4. Метро.
  5. Пешком до конечной точки.

Получение информации о пересадках

Каждая секция содержит подробные сведения о конкретном этапе поездки.

route.sections.forEach(section => {
    console.log(section.departure.place.name);
    console.log(section.arrival.place.name);
});

Пример вывода:

Alexanderplatz
Friedrichstraße

Информация может использоваться для построения интерфейса маршрута.

const transferInfo = {
    from: section.departure.place.name,
    to: section.arrival.place.name,
    duration: section.summary.duration
};

console.log(transferInfo);

Получение времени отправления и прибытия

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

const departureTime = section.departure.time;
const arrivalTime = section.arrival.time;

console.log(departureTime);
console.log(arrivalTime);

Результат:

2025-05-20T14:05:00+02:00
2025-05-20T14:21:00+02:00

Форматирование времени:

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

console.log(
    departure.toLocaleTimeString()
);

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

Для секций общественного транспорта доступны сведения о маршруте.

const transport = section.transport;

Например:

console.log(transport.name);
console.log(transport.category);
console.log(transport.mode);

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

U2
Metro
subway

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

const line = transport.name;

lineElement.textContent = line;

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

Для визуализации используется полилиния каждой секции.

route.sections.forEach(section => {

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

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

    map.addObject(polyline);
});

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

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

Различное оформление для разных видов транспорта

Каждый тип транспорта может отображаться собственным цветом.

function getColor(mode) {

    switch(mode) {

        case 'subway':
            return '#0066ff';

        case 'bus':
            return '#ff6600';

        case 'train':
            return '#008800';

        default:
            return '#666666';
    }
}

Применение стиля:

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

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


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

Координаты остановок содержатся в объектах отправления и прибытия.

const stop = section.departure.place.location;

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

const marker = new H.map.Marker({
    lat: stop.lat,
    lng: stop.lng
});

map.addObject(marker);

Добавление подписи:

marker.setData(
    section.departure.place.name
);

Информационные окна остановок

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

map.addEventListener('tap', event => {

    const target = event.target;

    if(target instanceof H.map.Marker) {

        const bubble = new H.ui.InfoBubble(
            target.getGeometry(),
            {
                content: target.getData()
            }
        );

        ui.addBubble(bubble);
    }
});

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

API позволяет учитывать время отправления.

const params = {
    transportMode: 'publicTransport',
    origin: '52.53086,13.38469',
    destination: '52.52064,13.40978',
    departureTime: '2025-06-15T08:00:00',
    return: 'summary'
};

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


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

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

const params = {
    transportMode: 'publicTransport',
    origin: '52.53086,13.38469',
    destination: '52.52064,13.40978',
    arrivalTime: '2025-06-15T09:00:00',
    return: 'summary'
};

В этом случае сервис рассчитывает время отправления автоматически.


Анализ длительности поездки

Общая продолжительность маршрута находится в объекте summary.

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

console.log(duration);

Преобразование секунд в минуты:

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

console.log(minutes);

Подсчёт количества пересадок

Количество транспортных участков легко определить программно.

const transfers =
    route.sections.filter(
        section => section.type === 'transit'
    ).length - 1;

console.log(transfers);

Результат:

2

Формирование пользовательского расписания

На основе полученных данных можно построить собственную таблицу движения.

const schedule = route.sections.map(section => {

    return {
        departure:
            section.departure.time,

        arrival:
            section.arrival.time,

        from:
            section.departure.place.name,

        to:
            section.arrival.place.name,

        line:
            section.transport?.name
    };
});

Полученный массив удобно использовать для генерации интерфейса.

schedule.forEach(item => {

    console.log(
        item.departure,
        item.line,
        item.from,
        item.to
    );
});

Работа с несколькими вариантами маршрута

API может вернуть несколько альтернатив.

result.routes.forEach(route => {

    console.log(
        route.sections.length
    );
});

Сравнение маршрутов по времени:

const sortedRoutes =
    result.routes.sort((a, b) => {

        const durationA =
            a.sections.reduce(
                (s, sec) =>
                    s + sec.summary.duration,
                0
            );

        const durationB =
            b.sections.reduce(
                (s, sec) =>
                    s + sec.summary.duration,
                0
            );

        return durationA - durationB;
    });

Отображение полной информации о поездке

Сводный объект может содержать все необходимые данные.

const trip = {

    totalDuration:
        route.sections.reduce(
            (sum, sec) =>
                sum + sec.summary.duration,
            0
        ),

    transfers:
        route.sections.filter(
            sec => sec.type === 'transit'
        ).length - 1,

    sections:
        route.sections.map(sec => ({
            type: sec.type,
            departure:
                sec.departure.time,
            arrival:
                sec.arrival.time,
            from:
                sec.departure.place.name,
            to:
                sec.arrival.place.name,
            line:
                sec.transport?.name
        }))
};

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