Система отображения данных в MapLibre GL JS построена вокруг концепции слоёв (layers). Каждый слой отвечает за визуализацию определённого набора данных и определяет, каким образом эти данные отображаются на карте.
Источник данных (source) и слой (layer) являются разными сущностями:
Один источник может использоваться несколькими слоями одновременно. Например, один набор геометрий может отображаться как полигоны, контуры и подписи.
map.addSource('cities', {
type: 'geojson',
data: 'cities.geojson'
});
map.addLayer({
id: 'city-circles',
type: 'circle',
source: 'cities'
});
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities'
});
В данном примере один GeoJSON-источник отображается двумя различными слоями.
При создании слоя используется объект конфигурации.
map.addLayer({
id: 'roads',
type: 'line',
source: 'transport'
});
Наиболее важные свойства:
| Свойство | Назначение |
|---|---|
id |
Уникальный идентификатор слоя |
type |
Тип визуализации |
source |
Источник данных |
source-layer |
Слой внутри векторного тайла |
layout |
Параметры компоновки |
paint |
Параметры отрисовки |
filter |
Фильтрация объектов |
minzoom |
Минимальный масштаб отображения |
maxzoom |
Максимальный масштаб отображения |
Пример:
map.addLayer({
id: 'highways',
type: 'line',
source: 'roads',
paint: {
'line-color': '#ff6600',
'line-width': 4
},
minzoom: 8,
maxzoom: 22
});
MapLibre GL JS поддерживает несколько типов слоёв, предназначенных для отображения различных видов данных.
Основные типы:
Каждый тип имеет собственный набор параметров и применяется для решения определённых задач.
Тип background используется для отображения фоновой
заливки всей карты.
Такой слой не требует источника данных.
map.addLayer({
id: 'background',
type: 'background',
paint: {
'background-color': '#f5f5f5'
}
});
Дополнительные параметры:
paint: {
'background-color': '#dceeff',
'background-opacity': 0.8
}
Часто применяется:
Тип fill предназначен для отображения полигонов.
Типичные объекты:
Пример:
map.addLayer({
id: 'regions',
type: 'fill',
source: 'regions',
paint: {
'fill-color': '#4CAF50',
'fill-opacity': 0.6
}
});
'fill-color': '#2196F3'
'fill-opacity': 0.5
'fill-outline-color': '#000000'
Полный пример:
map.addLayer({
id: 'parks',
type: 'fill',
source: 'parks',
paint: {
'fill-color': '#7cb342',
'fill-opacity': 0.7,
'fill-outline-color': '#558b2f'
}
});
Тип line используется для отображения линейных
объектов.
Подходит для:
Пример:
map.addLayer({
id: 'roads',
type: 'line',
source: 'roads',
paint: {
'line-color': '#ff9800',
'line-width': 3
}
});
'line-width': 5
'line-color': '#ff0000'
'line-opacity': 0.8
'line-dasharray': [2, 2]
layout: {
'line-join': 'round',
'line-cap': 'round'
}
Пример маршрута:
map.addLayer({
id: 'route',
type: 'line',
source: 'route-source',
layout: {
'line-cap': 'round',
'line-join': 'round'
},
paint: {
'line-color': '#1976d2',
'line-width': 6
}
});
Тип symbol отвечает за отображение текстов и иконок.
Наиболее распространённый тип для:
Пример текстовых подписей:
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'name'],
'text-size': 14
}
});
layout: {
'icon-image': 'airport'
}
layout: {
'icon-image': 'airport',
'text-field': ['get', 'name']
}
paint: {
'text-color': '#333333'
}
paint: {
'text-halo-color': '#ffffff',
'text-halo-width': 2
}
Полный пример:
map.addLayer({
id: 'airports',
type: 'symbol',
source: 'airports',
layout: {
'icon-image': 'airport',
'text-field': ['get', 'name'],
'text-offset': [0, 1.5],
'text-anchor': 'top'
},
paint: {
'text-color': '#222222',
'text-halo-color': '#ffffff',
'text-halo-width': 2
}
});
Тип circle отображает точки в виде окружностей.
Подходит для:
Пример:
map.addLayer({
id: 'cities',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': 8,
'circle-color': '#e91e63'
}
});
'circle-radius': 10
'circle-color': '#2196f3'
'circle-stroke-width': 2,
'circle-stroke-color': '#ffffff'
'circle-opacity': 0.7
Полный пример:
map.addLayer({
id: 'stations',
type: 'circle',
source: 'stations',
paint: {
'circle-radius': 7,
'circle-color': '#ff5722',
'circle-stroke-width': 2,
'circle-stroke-color': '#ffffff'
}
});
Тип heatmap предназначен для построения тепловых
карт.
Применяется для визуализации:
Пример:
map.addLayer({
id: 'heat',
type: 'heatmap',
source: 'events'
});
Настройка интенсивности:
paint: {
'heatmap-intensity': 2
}
Настройка радиуса:
paint: {
'heatmap-radius': 30
}
Настройка прозрачности:
paint: {
'heatmap-opacity': 0.8
}
Комплексный пример:
map.addLayer({
id: 'population-heatmap',
type: 'heatmap',
source: 'population',
paint: {
'heatmap-radius': 25,
'heatmap-intensity': 1.5,
'heatmap-opacity': 0.9
}
});
Тип fill-extrusion используется для построения
трёхмерных объектов.
Наиболее часто применяется для отображения:
Пример:
map.addLayer({
id: 'buildings',
type: 'fill-extrusion',
source: 'buildings',
paint: {
'fill-extrusion-color': '#aaaaaa',
'fill-extrusion-height': ['get', 'height']
}
});
'fill-extrusion-height': 100
'fill-extrusion-base': 10
'fill-extrusion-color': '#607d8b'
'fill-extrusion-opacity': 0.8
Пример отображения зданий:
map.addLayer({
id: '3d-buildings',
type: 'fill-extrusion',
source: 'buildings',
paint: {
'fill-extrusion-color': '#9e9e9e',
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-opacity': 0.85
}
});
Тип raster используется для отображения растровых
тайлов.
Источником могут быть:
Пример подключения:
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://server.example.com/{z}/{x}/{y}.png'
],
tileSize: 256
});
map.addLayer({
id: 'satellite',
type: 'raster',
source: 'satellite'
});
Настройки прозрачности:
paint: {
'raster-opacity': 0.7
}
Настройки яркости:
paint: {
'raster-brightness-min': 0.2,
'raster-brightness-max': 1
}
Тип hillshade предназначен для визуализации рельефа на
основе цифровой модели высот.
Используется для:
Пример:
map.addLayer({
id: 'terrain',
type: 'hillshade',
source: 'dem'
});
Настройка теней:
paint: {
'hillshade-shadow-color': '#444444'
}
Настройка освещения:
paint: {
'hillshade-highlight-color': '#ffffff'
}
Настройка средней зоны:
paint: {
'hillshade-accent-color': '#999999'
}
Слои отображаются сверху вниз в соответствии с порядком добавления.
map.addLayer(backgroundLayer);
map.addLayer(roadsLayer);
map.addLayer(labelsLayer);
В данном случае:
Для вставки слоя перед другим используется второй параметр метода
addLayer.
map.addLayer(
newLayer,
'labels'
);
Новый слой будет вставлен непосредственно перед слоем
labels.
Получение слоя:
const layer = map.getLayer('roads');
Удаление:
map.removeLayer('roads');
Проверка существования:
if (map.getLayer('roads')) {
console.log('Слой найден');
}
Изменение параметров отображения:
map.setPaintProperty(
'roads',
'line-color',
'#ff0000'
);
Изменение параметров компоновки:
map.setLayoutProperty(
'roads',
'visibility',
'none'
);
Отображение обратно:
map.setLayoutProperty(
'roads',
'visibility',
'visible'
);
Слой может отображать только часть объектов источника.
Пример отображения только крупных городов:
map.addLayer({
id: 'large-cities',
type: 'circle',
source: 'cities',
filter: [
'>',
['get', 'population'],
1000000
]
});
Фильтрация по типу объекта:
filter: [
'==',
['get', 'type'],
'capital'
]
Фильтрация по нескольким условиям:
filter: [
'all',
['==', ['get', 'country'], 'France'],
['>', ['get', 'population'], 500000]
]
Подобный подход позволяет использовать один источник данных для множества специализированных слоёв.
Одной из сильных сторон MapLibre GL JS является возможность одновременно использовать несколько типов визуализации.
Пример комплексной карты:
// Спутниковая подложка
raster
// Здания
fill-extrusion
// Дороги
line
// Парки
fill
// Города
circle
// Подписи
symbol
Подобная структура широко применяется в современных веб-ГИС и позволяет создавать многоуровневые интерактивные карты с высокой производительностью и гибкой настройкой внешнего вида каждого набора пространственных данных.