Маршрутизация в Mapbox GL JS строится вокруг работы с профилями движения, предоставляемыми сервисами Mapbox, где выбор между автомобилем, пешим передвижением и велосипедом влияет на геометрию маршрута, матрицу расстояний, ограничения дорог и логику построения линии на карте.
В основе навигационных сценариев лежат профили маршрутов, определяющие допустимую сеть дорог и алгоритмы построения пути:
Каждый профиль влияет на:
Основой построения маршрутов является Mapbox Directions API, который возвращает геометрию маршрута в формате GeoJSON-подобной структуры. Он используется как внешний сервис, а Mapbox GL JS отвечает за визуализацию результата на карте.
Типичный запрос включает:
Пример HTTP-запроса:
https://api.mapbox.com/directions/v5/mapbox/driving/30.3351,59.9343;30.3609,59.9311
?geometries=geojson&steps=true&access_token=YOUR_TOKEN
Профиль driving в URL можно заменить на:
walkingcyclingdriving-trafficПосле получения геометрии маршрута его необходимо отрисовать как слой
типа line.
map.addSource('route', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: []
}
}
});
Источник создаётся пустым и заполняется после ответа API.
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route',
paint: {
'line-color': '#3b82f6',
'line-width': 5,
'line-opacity': 0.85
}
});
Линия маршрута визуально отделяется от базовой карты за счёт:
После получения ответа Directions API данные источника обновляются:
fetch(directionsUrl)
.then(res => res.json())
.then(data => {
const route = data.routes[0].geometry;
map.getSource('route').setData({
type: 'Feature',
geometry: route
});
});
При смене профиля (например, с driving на cycling) пересчитывается весь маршрут, поскольку граф дорог меняется.
Автомобильный профиль ориентирован на дорожную инфраструктуру:
Часто используется в логистике и навигации транспорта.
Расширение driving с учётом текущей дорожной
обстановки:
Маршрут может изменяться в зависимости от времени суток.
Пешеходный профиль учитывает:
Особенность — более плотная сеть маршрутов и больше альтернативных путей.
Велосипедный профиль балансирует между:
Может избегать магистралей и опасных участков.
При включённом параметре steps=true API возвращает
подробную структуру манёвров:
Каждый шаг содержит:
Это позволяет строить навигационные интерфейсы.
Для улучшения читаемости добавляются маркеры:
new mapboxgl.Marker({ color: 'green' })
.setLngLat(start)
.addTo(map);
new mapboxgl.Marker({ color: 'red' })
.setLngLat(end)
.addTo(map);
Маркеризация особенно важна при сравнении профилей, когда маршруты визуально расходятся.
Directions API может возвращать несколько вариантов пути:
alternatives=true
Каждый маршрут:
В интерфейсе часто отображается:
При работе с большими маршрутами важны оптимизации:
setData вместо пересоздания слояОсобенно критично это для driving-traffic, где маршруты
пересчитываются чаще.
При переключении между walking, cycling и driving необходимо:
Типичная логика:
function updateRoute(profile) {
const url = buildDirectionsUrl(profile);
fetch(url)
.then(r => r.json())
.then(data => {
map.getSource('route').setData({
type: 'Feature',
geometry: data.routes[0].geometry
});
});
}
Все маршруты возвращаются в формате:
Mapbox GL JS использует ту же систему координат, что позволяет напрямую подавать данные без трансформации.
При интерактивных приложениях (например, перетаскивание точки назначения):
Это предотвращает визуальные артефакты при быстром изменении маршрута.
Разные профили часто визуально различаются:
Также применяются:
Маршруты обычно строятся на основе:
Каждое изменение точки инициирует новый запрос к Directions API, что формирует интерактивную навигационную систему поверх Mapbox GL JS.