Маршруты в Mapbox GL JS формируются как геометрические линии,
получаемые из внешних сервисов маршрутизации или пользовательских
данных, и отображаются через источники типа GeoJSON или
vector tiles. В зависимости от логики построения и
назначения выделяются несколько ключевых типов маршрутов, каждый из
которых требует различного подхода к получению данных, их интерпретации
и визуализации.
Любой маршрут в Mapbox GL JS представлен в виде объекта
LineString, входящего в структуру GeoJSON:
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[lng1, lat1],
[lng2, lat2],
[lng3, lat3]
]
},
"properties": {
"routeType": "fastest"
}
}
Эта структура является универсальной: независимо от того, как был вычислен маршрут — через API или вручную — на стороне визуализации он всегда превращается в линию с набором координат.
В Mapbox GL JS маршрут обычно добавляется как
source:
map.addSource('route', {
type: 'geojson',
data: routeGeoJSON
});
И отображается через слой line:
map.addLayer({
id: 'route-layer',
type: 'line',
source: 'route',
layout: {
'line-join': 'round',
'line-cap': 'round'
},
paint: {
'line-color': '#3b82f6',
'line-width': 5
}
});
Быстрый маршрут строится с целью минимизации времени в пути. Он учитывает ограничения скорости, типы дорог, светофоры и вероятные задержки.
При использовании Mapbox Directions API он задаётся параметром
profile=driving или аналогичным:
const query = `https://api.mapbox.com/directions/v5/mapbox/driving/
${startLng},${startLat};${endLng},${endLat}
?alternatives=false&geometries=geojson&access_token=YOUR_TOKEN`;
Особенности визуализации:
Этот тип маршрута применяется в навигационных системах реального времени.
Кратчайший маршрут минимизирует расстояние, а не время. В Mapbox GL JS он не является отдельным режимом API, но может быть получен через оптимизацию графа или сторонние сервисы.
Характерные особенности:
При визуализации часто выделяется пунктирной линией:
paint: {
'line-color': '#10b981',
'line-width': 4,
'line-dasharray': [2, 2]
}
Mapbox Directions API поддерживает генерацию нескольких вариантов маршрута:
const url = `https://api.mapbox.com/directions/v5/mapbox/driving/
${coords}
?alternatives=true&geometries=geojson&access_token=YOUR_TOKEN`;
Ответ содержит массив routes, каждый элемент которого
представляет отдельный маршрут:
response.routes.forEach((route, index) => {
// route.geometry.coordinates
});
Особенности:
Визуально различают:
'line-opacity': 0.6
Мультимодальные маршруты объединяют несколько видов передвижения:
В Mapbox GL JS такие маршруты формируются через сторонние API или комбинирование нескольких запросов.
Структура данных обычно разбивается на сегменты:
{
type: "FeatureCollection",
features: [
{
geometry: { type: "LineString", coordinates: [...] },
properties: { mode: "walking" }
},
{
geometry: { type: "LineString", coordinates: [...] },
properties: { mode: "driving" }
}
]
}
Визуализация строится на основе mode:
paint: {
'line-color': [
'match',
['get', 'mode'],
'walking', '#f59e0b',
'driving', '#3b82f6',
'#9ca3af'
]
}
Велосипедные маршруты учитывают:
Mapbox API:
mapbox/cycling
Визуальные особенности:
Иногда применяется градиент для отображения подъёмов:
'line-gradient': [
'interpolate',
['linear'],
['line-progress'],
0, '#22c55e',
1, '#15803d'
]
Пешеходные маршруты строятся с учётом:
API профиль:
mapbox/walking
Особенности:
Визуально:
Грузовые маршруты учитывают ограничения:
Обычно реализуются через специализированные профили или сторонние API.
Пример логики фильтрации:
Визуально такие маршруты часто отображаются толстой линией с акцентом на стабильность пути:
'line-width': 6,
'line-color': '#1d4ed8'
В Mapbox GL JS маршруты часто разбиваются на несколько слоёв:
Пример обводки:
map.addLayer({
id: 'route-outline',
type: 'line',
source: 'route',
paint: {
'line-color': '#111827',
'line-width': 8
}
});
Поверх неё добавляется основной слой:
map.addLayer({
id: 'route-main',
type: 'line',
source: 'route',
paint: {
'line-color': '#3b82f6',
'line-width': 5
}
});
Маршруты часто пересчитываются в реальном времени:
function updateRoute(newCoords) {
const source = map.getSource('route');
source.setData({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: newCoords
}
});
}
Это позволяет реализовать:
Маршрут может использоваться как траектория движения объекта:
let step = 0;
function animate() {
const coords = route.geometry.coordinates.slice(0, step);
map.getSource('trace').setData({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: coords
}
});
step++;
requestAnimationFrame(animate);
}
Такой подход применяется для:
При наличии нескольких маршрутов система обычно использует критерии:
Визуально это отражается через:
Пример логики выбора основного маршрута:
const bestRoute = routes.reduce((a, b) =>
a.duration < b.duration ? a : b
);
Маршрут может быть разбит на legs и
steps:
Пример структуры:
route.legs.forEach(leg => {
leg.steps.forEach(step => {
console.log(step.maneuver.instruction);
});
});
Это используется для:
Маршрут в Mapbox GL JS может быть интерактивным объектом:
Пример обработки клика:
map.on('click', (e) => {
const coords = [e.lngLat.lng, e.lngLat.lat];
updateRoute([...currentRoute, coords]);
});
В сложных приложениях маршруты комбинируются с другими слоями:
Пример наложения:
map.addLayer({
id: 'traffic',
type: 'line',
source: 'traffic-data',
paint: {
'line-color': [
'match',
['get', 'congestion'],
'low', '#22c55e',
'moderate', '#facc15',
'high', '#ef4444',
'#9ca3af'
]
}
});
Маршруты часто сохраняются в формате GeoJSON для:
Пример сериализации:
const saved = JSON.stringify(routeGeoJSON);
localStorage.setItem('route', saved);
Загрузка:
const route = JSON.parse(localStorage.getItem('route'));
map.getSource('route').setData(route);
При большом количестве маршрутов критичны:
turf.simplify)vector tiles вместо GeoJSONОптимизация линии:
const simplified = turf.simplify(route, {
tolerance: 0.0001,
highQuality: false
});