В MapLibre GL JS полигональные объекты почти всегда описываются через
формат GeoJSON. Основная структура — объект типа Feature с
геометрией Polygon или MultiPolygon.
Ключевые особенности структуры:
[долгота, широта]Пример полигона с вырезом:
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[37.62, 55.75],
[37.65, 55.75],
[37.65, 55.78],
[37.62, 55.78],
[37.62, 55.75]
],
[
[37.63, 55.76],
[37.64, 55.76],
[37.64, 55.77],
[37.63, 55.77],
[37.63, 55.76]
]
]
},
"properties": {
"name": "test polygon"
}
}
Полигональные данные подключаются через источник
geojson. Это базовый способ работы с пользовательскими
геометриями.
map.on('load', () => {
map.addSource('areas', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [polygonFeature]
}
});
});
Источник можно обновлять динамически, заменяя весь набор данных:
map.getSource('areas').setData(newGeojson);
Это ключевой механизм для интерактивных редакторов и динамических карт.
Основной тип слоя для отображения полигонов — fill.
map.addLayer({
id: 'areas-fill',
type: 'fill',
source: 'areas',
paint: {
'fill-color': '#3b82f6',
'fill-opacity': 0.5
}
});
fill-color — цвет заливкиfill-opacity — прозрачностьfill-outline-color — цвет обводки (ограниченно
используется)fill-pattern — текстура вместо цветаПример с условной стилизацией:
'fill-color': [
'case',
['==', ['get', 'type'], 'park'],
'#22c55e',
'#3b82f6'
]
Хотя fill-outline-color существует, на практике для
точного контроля используется отдельный слой line.
map.addLayer({
id: 'areas-outline',
type: 'line',
source: 'areas',
paint: {
'line-color': '#1f2937',
'line-width': 2
}
});
MapLibre GL JS рендерит слои строго по порядку добавления. Это важно для полигонов, особенно при наложении нескольких типов визуализации:
fill)line)symbol)Пример корректного порядка:
map.addLayer(fillLayer);
map.addLayer(outlineLayer);
map.addLayer(labelLayer);
MultiPolygon используется для объединения нескольких
независимых областей в одном объекте.
{
"type": "MultiPolygon",
"coordinates": [
[
[
[0, 0],
[1, 0],
[1, 1],
[0, 1],
[0, 0]
]
],
[
[
[2, 2],
[3, 2],
[3, 3],
[2, 3],
[2, 2]
]
]
]
}
Особенности:
propertiesОдно из ключевых преимуществ GeoJSON-сорсов — возможность обновления без перерисовки всей карты.
function updatePolygon(newCoordinates) {
const source = map.getSource('areas');
const updated = {
type: 'FeatureCollection',
features: [{
type: 'Feature',
geometry: {
type: 'Polygon',
coordinates: newCoordinates
}
}]
};
source.setData(updated);
}
Типичные сценарии:
MapLibre GL JS позволяет работать с полигонами через события карты.
map.on('click', 'areas-fill', (e) => {
const feature = e.features[0];
console.log(feature.properties);
});
map.on('mouseenter', 'areas-fill', () => {
map.getCanvas().style.cursor = 'pointer';
});
map.on('mouseleave', 'areas-fill', () => {
map.getCanvas().style.cursor = '';
});
map.on('mousemove', (e) => {
const features = map.queryRenderedFeatures(e.point, {
layers: ['areas-fill']
});
});
Фильтры позволяют отображать только часть объектов без изменения данных.
map.setFilter('areas-fill', ['==', ['get', 'active'], true]);
Распространённые операции:
all, any,
noneMapLibre GL JS поддерживает выражения (expressions), позволяющие строить динамическую визуализацию.
'fill-color': [
'interpolate',
['linear'],
['get', 'density'],
0, '#dbeafe',
100, '#1d4ed8'
]
'fill-opacity': [
'case',
['boolean', ['get', 'selected'], false],
0.8,
0.3
]
Полигональные данные могут быть тяжёлыми, особенно при высокой детализации.
Основные ограничения:
setData вызывают перерасчёт слояОптимизационные подходы:
generateId: true для отслеживания
объектовПри больших наборах данных предпочтительнее использовать
vector source:
map.addSource('areas', {
type: 'vector',
url: 'mapbox://tileset.id'
});
Слои остаются теми же, но данные подгружаются по тайлам, а не целиком.
Плоские полигоны можно преобразовать в объёмные объекты.
map.addLayer({
id: 'buildings-3d',
type: 'fill-extrusion',
source: 'areas',
paint: {
'fill-extrusion-color': '#888',
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-opacity': 0.7
}
});
Особенности:
При работе с перекрывающимися областями важен контроль порядка и прозрачности:
fill-opacity влияет на читаемость нижних слоёвИногда применяется техника:
Для редактирования обычно используется вспомогательная логика или библиотеки поверх MapLibre GL JS.
Типовые операции:
Обновление происходит через:
source.setData(updatedGeojson);
При этом UI-слой обычно синхронизируется с массивом координат в памяти приложения.
Такие ошибки приводят к некорректному отображению или полному отсутствию слоя.
Полигоны часто требуют разного вида на разных zoom-уровнях:
'fill-opacity': [
'interpolate',
['linear'],
['zoom'],
5, 0.2,
10, 0.6,
15, 0.9
]
Это позволяет: