Стиль (Style) в MapLibre GL JS представляет собой JSON-документ, описывающий внешний вид карты. В нём определяются:
Стиль является центральным элементом визуализации. Именно он определяет, каким образом географические данные будут преобразованы в готовую карту.
При создании экземпляра карты стиль указывается через свойство
style:
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
center: [37.6176, 55.7558],
zoom: 10
});
После загрузки стиля движок автоматически загружает все связанные ресурсы и формирует итоговое изображение карты.
MapLibre GL JS поддерживает несколько вариантов загрузки:
Каждый подход имеет собственные особенности и сценарии применения.
Самый распространённый вариант — хранение файла стиля рядом с приложением.
Структура проекта:
project/
│
├── index.html
├── styles/
│ └── map-style.json
└── js/
└── app.js
Создание карты:
const map = new maplibregl.Map({
container: 'map',
style: './styles/map-style.json'
});
Во время инициализации браузер отправляет запрос к файлу стиля, получает JSON и передаёт его в MapLibre.
Фрагмент такого файла:
{
"version": 8,
"sources": {},
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#f0f0f0"
}
}
]
}
Минимально допустимый стиль обязан содержать:
version;sources;layers.Во многих проектах стили располагаются на отдельном сервере или CDN.
Пример:
const map = new maplibregl.Map({
container: 'map',
style: 'https://example.com/styles/city-style.json'
});
Преимущества такого подхода:
Важно учитывать настройки CORS.
Сервер должен возвращать заголовки:
Access-Control-Allow-Origin: *
или
Access-Control-Allow-Origin: https://my-site.com
Без корректной настройки браузер заблокирует загрузку ресурса.
Файл JSON не является обязательным. Стиль можно описать непосредственно в коде.
Пример:
const style = {
version: 8,
sources: {},
layers: [
{
id: 'background',
type: 'background',
paint: {
'background-color': '#dbeafe'
}
}
]
};
const map = new maplibregl.Map({
container: 'map',
style: style
});
Такой способ удобен для:
Полноценный стиль обычно состоит из нескольких разделов.
Пример упрощённой структуры:
{
"version": 8,
"glyphs": "https://example.com/fonts/{fontstack}/{range}.pbf",
"sprite": "https://example.com/sprites/sprite",
"sources": {},
"layers": []
}
Основные элементы:
| Поле | Назначение |
|---|---|
| version | Версия спецификации |
| glyphs | URL шрифтов |
| sprite | URL набора иконок |
| sources | Источники данных |
| layers | Слои карты |
| light | Настройки освещения |
| terrain | Рельеф |
| sky | Небо |
На практике стиль почти всегда содержит источники данных.
Пример:
{
"version": 8,
"sources": {
"osm": {
"type": "vector",
"tiles": [
"https://tiles.example.com/{z}/{x}/{y}.pbf"
]
}
},
"layers": [
{
"id": "roads",
"type": "line",
"source": "osm",
"source-layer": "transportation"
}
]
}
Последовательность загрузки выглядит следующим образом:
Если один из ресурсов недоступен, соответствующие слои могут не отображаться.
После загрузки стиля возникает событие load.
map.on('load', () => {
console.log('Карта полностью загружена');
});
Это событие срабатывает после завершения первичной инициализации.
Для проверки состояния можно использовать:
if (map.isStyleLoaded()) {
console.log('Стиль загружен');
}
Метод возвращает:
true
если все элементы стиля успешно загружены.
При изменении или повторной загрузке стиля возникает событие
styledata.
map.on('styledata', () => {
console.log('Стиль обновлён');
});
Сценарии срабатывания:
setStyle();Это событие часто используется для повторного добавления пользовательских слоёв.
MapLibre позволяет полностью заменить стиль карты во время работы приложения.
map.setStyle('dark-style.json');
После выполнения:
Пример переключения темы:
document
.getElementById('dark-theme')
.addEventListener('click', () => {
map.setStyle('styles/dark.json');
});
Метод setStyle() принимает не только URL.
map.setStyle({
version: 8,
sources: {},
layers: [
{
id: 'background',
type: 'background',
paint: {
'background-color': '#000000'
}
}
]
});
Это позволяет генерировать внешний вид карты программно.
После вызова setStyle() пользовательские слои обычно
исчезают.
Например:
map.addSource('cities', {
type: 'geojson',
data: 'cities.geojson'
});
После смены стиля источник будет удалён.
Распространённое решение:
map.on('styledata', () => {
if (!map.getSource('cities')) {
map.addSource('cities', {
type: 'geojson',
data: 'cities.geojson'
});
}
});
Таким образом слой автоматически восстанавливается после каждой загрузки нового стиля.
Иногда требуется предварительно обработать стиль.
Для этого используется fetch().
async function loadStyle() {
const response = await fetch('style.json');
const style = await response.json();
map.setStyle(style);
}
Подход позволяет:
Полученный JSON можно менять программно.
Пример изменения цвета фона:
const response = await fetch('style.json');
const style = await response.json();
style.layers[0].paint['background-color'] = '#111827';
map.setStyle(style);
Фактически стиль становится обычным объектом JavaScript.
Некоторые приложения полностью создают стиль программно.
Пример:
function createStyle(color) {
return {
version: 8,
sources: {},
layers: [
{
id: 'background',
type: 'background',
paint: {
'background-color': color
}
}
]
};
}
map.setStyle(createStyle('#22c55e'));
Подход широко используется в:
При недоступности файла или наличии ошибок возникает событие
error.
map.on('error', (event) => {
console.error(event.error);
});
Типичные причины:
Пример сообщения:
Failed to load resource
или
Unexpected token
при повреждённом JSON.
Даже небольшая синтаксическая ошибка приводит к невозможности загрузки.
Некорректный пример:
{
"version": 8,
"sources": {},
"layers": [],
}
Лишняя запятая после массива делает документ невалидным.
Корректный вариант:
{
"version": 8,
"sources": {},
"layers": []
}
Для отображения подписей стиль содержит параметр
glyphs.
Пример:
{
"glyphs": "https://fonts.example.com/{fontstack}/{range}.pbf"
}
Во время загрузки MapLibre автоматически запрашивает нужные диапазоны символов.
Шаблон:
{fontstack}
заменяется названием шрифта, а
{range}
диапазоном символов.
Наборы иконок подключаются через свойство sprite.
{
"sprite": "https://example.com/sprites/sprite"
}
MapLibre автоматически загрузит:
sprite.json
sprite.png
или их масштабируемые версии для экранов высокой плотности.
После загрузки иконки становятся доступны слоям типа:
{
"type": "symbol"
}
через свойство:
"icon-image"
В крупных проектах часто создаются отдельные конфигурации:
light.json
dark.json
satellite.json
terrain.json
Переключение может выглядеть следующим образом:
const styles = {
light: 'styles/light.json',
dark: 'styles/dark.json',
satellite: 'styles/satellite.json'
};
map.setStyle(styles.dark);
Такой подход упрощает поддержку приложения и позволяет быстро переключать режимы отображения.
Браузер обычно кэширует файлы стилей.
При разработке это может приводить к отображению устаревшей версии.
Для принудительного обновления часто используется параметр версии:
style: 'style.json?v=15'
После изменения номера версии браузер загружает новый файл.
Другой вариант — настройка HTTP-заголовков:
Cache-Control: no-cache
или
Cache-Control: max-age=86400
в зависимости от требований проекта.
Для крупных приложений удобно разделять ресурсы по каталогам.
Пример структуры:
styles/
│
├── light/
│ ├── style.json
│ ├── sprite.png
│ └── sprite.json
│
├── dark/
│ ├── style.json
│ ├── sprite.png
│ └── sprite.json
│
└── terrain/
├── style.json
├── sprite.png
└── sprite.json
Такая организация облегчает:
Использование абсолютных URL упрощает переносимость стилей между проектами и серверами.
Разделение данных и оформления позволяет менять внешний вид карты без изменения источников геоданных.
Контроль событий загрузки помогает корректно восстанавливать пользовательские слои после смены стиля.
Проверка доступности ресурсов предотвращает ситуации, при которых карта отображается частично или остаётся пустой.
Хранение стилей в системе контроля версий позволяет отслеживать изменения оформления карты и быстро возвращаться к предыдущим конфигурациям.
Генерация стилей через JavaScript обеспечивает высокий уровень гибкости и позволяет создавать полностью динамические интерфейсы картографических приложений на базе MapLibre GL JS.