LineString представляет собой линейную геометрию, описывающую последовательность координат, соединённых непрерывной линией. В контексте веб-картографии и MapLibre GL JS этот тип геометрии используется для отображения маршрутов, треков, дорог, кабельных линий, траекторий движения и любых других объектов, обладающих линейной природой без ширины и площади как у полигонов.
LineString в MapLibre GL JS базируется на стандарте GeoJSON. Структура данных строго определена:
{
"type": "LineString",
"coordinates": [
[37.6173, 55.7558],
[37.6250, 55.7600],
[37.6400, 55.7700]
]
}
Ключевые особенности:
[долгота, широта]LineString не содержит свойств ширины или стиля — он описывает только геометрию. Визуальное представление задаётся на уровне слоя (layer).
Для отображения LineString в MapLibre GL JS используется источник
типа geojson:
map.on('load', () => {
map.addSource('route', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [
[37.6173, 55.7558],
[37.6250, 55.7600],
[37.6400, 55.7700]
]
}
}
});
});
Важно учитывать:
Feature, так и
FeatureCollectionFeature.geometrysetDataДля визуализации используется слой типа line:
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route',
layout: {
'line-join': 'round',
'line-cap': 'round'
},
paint: {
'line-color': '#3b82f6',
'line-width': 4
}
});
line-color
line-width
line-opacity
line-dasharray
Пример пунктирной линии:
paint: {
'line-color': '#ef4444',
'line-width': 3,
'line-dasharray': [2, 2]
}
GeoJSON поддерживает коллекции:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [[0, 0], [10, 10]]
}
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [[10, 0], [20, 10]]
}
}
]
}
MapLibre GL JS автоматически отрисует каждую линию в рамках одного слоя.
Одно из ключевых преимуществ GeoJSON источников — возможность обновления данных:
const source = map.getSource('route');
source.setData({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [
[37.6173, 55.7558],
[37.6500, 55.7800],
[37.7000, 55.8000]
]
}
});
Это используется для:
LineString часто применяется для визуализации движения. Простейший подход — постепенное увеличение массива координат.
let index = 1;
function animateLine() {
const coords = fullRoute.slice(0, index);
map.getSource('route').setData({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: coords
}
});
index++;
if (index <= fullRoute.length) {
requestAnimationFrame(animateLine);
}
}
Более сложные сценарии используют интерполяцию между точками, особенно при работе с временными рядами GPS-данных.
MapLibre GL JS поддерживает мощную систему выражений:
paint: {
'line-color': [
'interpolate',
['linear'],
['zoom'],
5, '#2563eb',
10, '#10b981',
15, '#f59e0b'
],
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 2,
15, 8
]
}
Такой подход позволяет:
Для интерактивности используется событие click:
map.on('click', 'route-line', (e) => {
const features = map.queryRenderedFeatures(e.point, {
layers: ['route-line']
});
if (features.length) {
console.log(features[0].geometry);
}
});
Дополнительно можно реализовать:
Часто используется второй слой для состояния hover:
map.addLayer({
id: 'route-line-hover',
type: 'line',
source: 'route',
paint: {
'line-color': '#f97316',
'line-width': 6
},
filter: ['==', ['get', 'id'], 'active']
});
Изменение состояния:
map.setFeatureState(
{ source: 'route', id: 1 },
{ active: true }
);
LineString можно использовать для анализа геометрии:
Хотя MapLibre GL JS не выполняет геоаналитику, он отображает уже подготовленные данные.
Типичный подход:
При работе с большими линиями (десятки тысяч точек):
setDataПример упрощения:
LineString не поддерживает разрывы внутри одной геометрии. Для разрывов используются:
{
"type": "MultiLineString",
"coordinates": [
[[0, 0], [5, 5]],
[[10, 10], [15, 15]]
]
}
В MapLibre GL JS это позволяет:
LineString часто дополняется атрибутами:
{
"type": "Feature",
"properties": {
"type": "highway",
"speed": 80
},
"geometry": {
"type": "LineString",
"coordinates": [...]
}
}
Далее свойства используются в стилях:
paint: {
'line-color': [
'match',
['get', 'type'],
'highway', '#ef4444',
'street', '#3b82f6',
'#999999'
]
}
LineString имеет ряд строгих правил:
LineString применяется в следующих задачах:
map.on('load', () => {
map.addSource('track', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: []
}
}
});
map.addLayer({
id: 'track-line',
type: 'line',
source: 'track',
paint: {
'line-color': '#22c55e',
'line-width': 5
}
});
});
function updateTrack(newPoint) {
const source = map.getSource('track');
const data = source._data;
data.geometry.coordinates.push(newPoint);
source.setData(data);
}
Такая архитектура позволяет строить потоковые визуализации данных, где каждая новая точка мгновенно отражается на карте.
LineString часто расширяется временной осью:
{
"type": "Feature",
"properties": {
"timestamps": [1710000000, 1710000060, 1710000120]
},
"geometry": {
"type": "LineString",
"coordinates": [...]
}
}
Это позволяет:
LineString тесно связан с визуальным восприятием карты:
line-width часто адаптируется под zoom'line-width': [
'interpolate',
['exponential', 1.5],
['zoom'],
5, 1,
18, 10
]
Такие настройки обеспечивают стабильное визуальное восприятие на всех уровнях масштабирования.