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 применяется, когда требуется объединить несколько независимых полигонов в один объект слоя данных.
Ключевые различия:
Для отображения 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, что позволяет применять единые стили ко всем составляющим частям.
Для визуализации применяется слой типа 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 получает собственный контур, что визуально подчёркивает составную структуру объекта.
Внутренние кольца в 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). Координаты всегда задаются в порядке:
[долгота, широта]
Ошибка порядка координат приводит к некорректному размещению геометрии, часто с выходом за пределы видимой области карты.
Источник 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-пайплайном.
Особенности поведения:
Сложные MultiPolygon с большим количеством вершин могут существенно влиять на производительность рендеринга.
Факторы нагрузки:
Оптимизация обычно достигается упрощением геометрии до загрузки в источник данных или использованием серверной генерализации.
Каждый 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 слоёв порядок отрисовки
определяется свойством layer order. Нижние слои
перекрываются верхними без автоматического разрешения конфликтов
геометрии.
Возможные артефакты:
Корректная структура данных критична для стабильного отображения в WebGL-рендерере MapLibre GL JS