MultiPolygon геометрия

MultiPolygon в спецификации GeoJSON представляет собой коллекцию полигонов, объединённых в единую геометрическую сущность. В контексте картографических библиотек, таких как MapLibre GL JS, MultiPolygon используется для отображения сложных объектов, состоящих из нескольких несвязанных областей, каждая из которых может включать внешние и внутренние контуры (дыры).

Формат описывается как массив массивов координат:

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [lng, lat],
        [lng, lat],
        [lng, lat],
        [lng, lat]
      ]
    ],
    [
      [
        [lng, lat],
        [lng, lat],
        [lng, lat],
        [lng, lat]
      ]
    ]
  ]
}

Каждый элемент верхнего уровня — отдельный полигон. Каждый полигон может содержать несколько колец: первое — внешний контур, последующие — внутренние вырезы.

Отличия Polygon и MultiPolygon

Polygon используется для одной геометрической области. MultiPolygon применяется, когда требуется объединить несколько независимых полигонов в один объект слоя данных.

Ключевые различия:

  • Polygon содержит один набор координатных колец
  • MultiPolygon содержит массив полигонов
  • MultiPolygon позволяет объединять разрозненные географические области
  • В MapLibre GL JS оба типа обрабатываются через единый слой fill

Подготовка источника данных в MapLibre GL JS

Для отображения MultiPolygon используется GeoJSON Source. Структура источника не отличается от обычного GeoJSON, но геометрия должна строго соответствовать спецификации.

map.addSource('regions', {
  type: 'geojson',
  data: {
    type: 'FeatureCollection',
    features: [
      {
        type: 'Feature',
        geometry: {
          type: 'MultiPolygon',
          coordinates: [
            [
              [
                [37.62, 55.75],
                [37.64, 55.75],
                [37.64, 55.77],
                [37.62, 55.77],
                [37.62, 55.75]
              ]
            ],
            [
              [
                [37.60, 55.73],
                [37.62, 55.73],
                [37.62, 55.74],
                [37.60, 55.74],
                [37.60, 55.73]
              ]
            ]
          ]
        },
        properties: {
          name: 'Composite region'
        }
      }
    ]
  }
});

MapLibre GL JS интерпретирует MultiPolygon как единый Feature, что позволяет применять единые стили ко всем составляющим частям.

Отображение MultiPolygon через fill-layer

Для визуализации применяется слой типа fill. Он заполняет все полигоны, входящие в MultiPolygon, единым стилем.

map.addLayer({
  id: 'regions-fill',
  type: 'fill',
  source: 'regions',
  paint: {
    'fill-color': '#3b82f6',
    'fill-opacity': 0.5
  }
});

Все части MultiPolygon получают одинаковую заливку, включая внутренние и внешние полигоны.

Обводка и границы

Для отображения границ используется отдельный слой line. Это важно, поскольку fill-layer не позволяет тонко управлять контурами.

map.addLayer({
  id: 'regions-outline',
  type: 'line',
  source: 'regions',
  paint: {
    'line-color': '#1e3a8a',
    'line-width': 2
  }
});

Каждый полигон внутри MultiPolygon получает собственный контур, что визуально подчёркивает составную структуру объекта.

Вложенные отверстия (holes)

Внутренние кольца в Polygon и MultiPolygon интерпретируются как вырезы. Для корректного отображения важно соблюдать порядок координат: внешнее кольцо задаётся по часовой или против часовой стрелки в зависимости от конвенции, внутренние кольца — противоположно.

Пример MultiPolygon с отверстием:

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [0, 0],
        [10, 0],
        [10, 10],
        [0, 10],
        [0, 0]
      ],
      [
        [3, 3],
        [7, 3],
        [7, 7],
        [3, 7],
        [3, 3]
      ]
    ]
  ]
}

Внутренний квадрат создаёт «дырку» в основном полигоне.

Особенности координатной системы

MapLibre GL JS использует стандарт GeoJSON — WGS84 (EPSG:4326). Координаты всегда задаются в порядке:

[долгота, широта]

Ошибка порядка координат приводит к некорректному размещению геометрии, часто с выходом за пределы видимой области карты.

Динамическое обновление MultiPolygon

Источник GeoJSON может обновляться на лету, что позволяет изменять геометрию без пересоздания слоя.

const source = map.getSource('regions');

source.setData({
  type: 'FeatureCollection',
  features: [
    {
      type: 'Feature',
      geometry: {
        type: 'MultiPolygon',
        coordinates: updatedCoordinates
      }
    }
  ]
});

Такой подход используется при интерактивном редактировании границ или загрузке данных с сервера.

Преобразование и трансформации

MapLibre GL JS поддерживает трансформации карты (zoom, pitch, bearing), при этом MultiPolygon автоматически пересчитывается в экранные координаты WebGL-пайплайном.

Особенности поведения:

  • при увеличении масштаба увеличивается детализация визуализации
  • при наклоне (pitch) сохраняется топологическая корректность
  • при вращении (bearing) координаты не изменяются, меняется только проекция

Производительность при работе с MultiPolygon

Сложные MultiPolygon с большим количеством вершин могут существенно влиять на производительность рендеринга.

Факторы нагрузки:

  • общее количество вершин
  • число отдельных полигонов внутри MultiPolygon
  • наличие частых обновлений источника
  • одновременное использование нескольких fill-слоёв

Оптимизация обычно достигается упрощением геометрии до загрузки в источник данных или использованием серверной генерализации.

Использование свойств для стилизации

Каждый Feature MultiPolygon может содержать свойства, используемые в выражениях стилей MapLibre GL JS.

map.addLayer({
  id: 'regions-fill',
  type: 'fill',
  source: 'regions',
  paint: {
    'fill-color': [
      'match',
      ['get', 'type'],
      'admin', '#2563eb',
      'protected', '#16a34a',
      '#94a3b8'
    ],
    'fill-opacity': 0.6
  }
});

Такой подход позволяет визуально различать части MultiPolygon по атрибутам данных.

Пересечение и наложение MultiPolygon

При наложении нескольких MultiPolygon слоёв порядок отрисовки определяется свойством layer order. Нижние слои перекрываются верхними без автоматического разрешения конфликтов геометрии.

Возможные артефакты:

  • визуальное перекрытие границ
  • двойные линии на стыках
  • перекрытие прозрачных областей с усилением цвета

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

  • неверная вложенность массивов координат
  • перепутанный порядок latitude/longitude
  • незамкнутые кольца (отсутствие повторения первой точки в конце)
  • смешивание Polygon и MultiPolygon без нормализации
  • чрезмерно детализированная геометрия

Корректная структура данных критична для стабильного отображения в WebGL-рендерере MapLibre GL JS