MultiLineString геометрия

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 и интерпретирует данные именно в таком формате.

Подключение MultiLineString в MapLibre GL JS

Перед отображением геометрии необходимо добавить источник данных типа 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.

Отображение MultiLineString через line-layer

Для визуализации используется слой типа 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.

Стилизация MultiLineString

Стилизация осуществляется через свойства 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 и MultiLineString

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 — набор раздельных маршрутов или сегментов, которые логически связаны, но геометрически не соединены.

Динамическое обновление 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 важно учитывать нагрузку на рендеринг:

  • уменьшение количества вершин в линиях (simplification)
  • использование тайловых источников вместо одного GeoJSON
  • ограничение количества одновременно отображаемых сегментов
  • применение line-join: 'round' и line-cap: 'round' только при необходимости

Для больших данных предпочтительнее использовать векторные тайлы, так как GeoJSON начинает существенно замедлять отрисовку при росте объема координат.

Типичные ошибки при работе с MultiLineString

Часто встречаются следующие проблемы:

  • перепутанный порядок координат (широта/долгота вместо долгота/широта)
  • использование LineString структуры внутри MultiLineString без вложенности массивов
  • попытка стилизации отдельных линий внутри MultiLineString без разделения на features
  • чрезмерно детализированные координаты, приводящие к падению производительности
  • отсутствие проверки корректности GeoJSON перед передачей в источник

Корректная структура данных и понимание внутреннего представления геометрии в MapLibre GL JS определяют стабильность и предсказуемость визуализации сложных линейных объектов.