MultiLineString в GeoJSON представляет собой геометрический тип данных, состоящий из нескольких независимых линий, каждая из которых описывается массивом координат. В контексте MapLibre GL JS этот тип используется для отображения сложных линейных объектов: маршрутов с разрывами, сетей дорог, транспортных линий, контуров коммуникаций и других пространственных структур, которые не могут быть выражены одной непрерывной линией.
Формат GeoJSON для MultiLineString строго регламентирован. Основная идея заключается в том, что объект содержит массив линий, каждая из которых является отдельным LineString.
{
"type": "MultiLineString",
"coordinates": [
[
[30.5, 50.5],
[30.6, 50.6],
[30.7, 50.7]
],
[
[30.8, 50.8],
[30.9, 50.9]
]
]
}
Каждый вложенный массив представляет отдельную линию. Важно учитывать порядок координат: сначала долгота, затем широта. MapLibre GL JS строго следует спецификации GeoJSON и интерпретирует данные именно в таком формате.
Перед отображением геометрии необходимо добавить источник данных типа
geojson. MultiLineString полностью поддерживается без
дополнительных преобразований.
map.on('load', () => {
map.addSource('multiline-source', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'MultiLineString',
coordinates: [
[
[30.5, 50.5],
[30.6, 50.6]
],
[
[30.7, 50.7],
[30.8, 50.8]
]
]
}
}
});
});
Источник может быть как статическим объектом, так и динамическим URL, возвращающим GeoJSON.
Для визуализации используется слой типа line. MapLibre
GL JS автоматически разбивает MultiLineString на отдельные сегменты для
отрисовки.
map.addLayer({
id: 'multiline-layer',
type: 'line',
source: 'multiline-source',
paint: {
'line-color': '#3b82f6',
'line-width': 4,
'line-opacity': 0.8
}
});
Несмотря на то что геометрия содержит несколько линий, слой обрабатывает их как единый визуальный объект, если они принадлежат одному feature.
Стилизация осуществляется через свойства paint и
layout. MultiLineString поддерживает все стандартные
параметры line-layer.
paint: {
'line-color': '#ef4444',
'line-width': 3
}
paint: {
'line-color': '#111827',
'line-width': 2,
'line-dasharray': [2, 2]
}
Для создания эффекта изменения цвета вдоль линии можно использовать
line-gradient, но важно учитывать, что поведение зависит от
версии MapLibre GL JS и структуры данных.
paint: {
'line-width': 5,
'line-gradient': [
'interpolate',
['linear'],
['line-progress'],
0, '#22c55e',
1, '#3b82f6'
]
}
LineString представляет одну непрерывную линию:
{
"type": "LineString",
"coordinates": [
[30.5, 50.5],
[30.6, 50.6]
]
}
MultiLineString объединяет несколько независимых линий:
{
"type": "MultiLineString",
"coordinates": [
[[30.5, 50.5], [30.6, 50.6]],
[[31.0, 51.0], [31.2, 51.2]]
]
}
Ключевое отличие заключается в семантике: LineString описывает единый маршрут, MultiLineString — набор раздельных маршрутов или сегментов, которые логически связаны, но геометрически не соединены.
MapLibre GL JS позволяет обновлять данные источника без пересоздания слоя. Это важно при работе с маршрутами в реальном времени.
const source = map.getSource('multiline-source');
source.setData({
type: 'Feature',
geometry: {
type: 'MultiLineString',
coordinates: [
[
[30.5, 50.5],
[30.55, 50.55]
],
[
[30.6, 50.6],
[30.65, 50.65]
]
]
}
});
Такой подход позволяет плавно изменять отображение без мерцания и повторной инициализации слоя.
MultiLineString часто формируется из нескольких источников данных: GPS-треков, маршрутов API, геопространственных расчетов.
Пример объединения нескольких LineString в MultiLineString:
function toMultiLineString(lines) {
return {
type: 'Feature',
geometry: {
type: 'MultiLineString',
coordinates: lines.map(line => line.coordinates)
}
};
}
При работе с библиотеками геоанализа часто требуется нормализация данных перед передачей в MapLibre GL JS.
MapLibre GL JS поддерживает обработку событий на уровне слоя. MultiLineString не отличается от других геометрий в этом контексте.
map.on('click', 'multiline-layer', (e) => {
const feature = e.features[0];
console.log(feature.geometry.type);
});
Дополнительно можно использовать фильтрацию по свойствам, если источник содержит коллекцию объектов.
map.setFilter('multiline-layer', ['==', ['get', 'status'], 'active']);
При работе с большим количеством MultiLineString важно учитывать нагрузку на рендеринг:
line-join: 'round' и
line-cap: 'round' только при необходимостиДля больших данных предпочтительнее использовать векторные тайлы, так как GeoJSON начинает существенно замедлять отрисовку при росте объема координат.
Часто встречаются следующие проблемы:
Корректная структура данных и понимание внутреннего представления геометрии в MapLibre GL JS определяют стабильность и предсказуемость визуализации сложных линейных объектов.