Работа с расписанием общественного транспорта является важной частью транспортных и навигационных приложений. Библиотека 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 | Железнодорожный транспорт |
На практике маршрут может выглядеть следующим образом:
Каждая секция содержит подробные сведения о конкретном этапе поездки.
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 позволяет строить полнофункциональные транспортные решения с высокой степенью детализации и удобной визуализацией на карте.