Инициализация экземпляра карты в MapLibre GL JS начинается с подготовки DOM-элемента, который будет служить контейнером для WebGL-контекста. Контейнер обязан существовать в момент создания карты, поскольку библиотека напрямую привязывает рендеринг к указанному HTML-элементу.
Типовая разметка:
<div id="map"></div>
Ключевым требованием является наличие явных размеров. Без заданной высоты контейнер останется нулевой высоты, и карта не будет отображена.
#map {
width: 100%;
height: 100vh;
}
Важный момент: MapLibre GL использует WebGL, поэтому контейнер не
должен быть скрыт (display: none) на момент
инициализации.
Библиотека может быть подключена через CDN или установлена как модуль в сборщике.
CDN-вариант:
<link href="https://unpkg.com/maplibre-gl/dist/maplibre-gl.css" rel="stylesheet" />
<script src="https://unpkg.com/maplibre-gl/dist/maplibre-gl.js"></script>
Модульный вариант:
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';
После подключения становится доступен глобальный объект
maplibregl или импортированный модуль, содержащий основной
конструктор карты.
Основная точка входа — конструктор Map.
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [30.31413, 59.93863],
zoom: 10
});
container определяет DOM-элемент, в который будет
встроен WebGL canvas. Возможны варианты:
container: document.getElementById('map')
При ошибке в выборе контейнера карта не инициализируется и выбрасывает исключение.
style задаёт источник описания визуального стиля карты.
Это JSON-спецификация, включающая слои, источники данных, фильтры и
стилизацию.
Пример URL:
style: 'https://demotiles.maplibre.org/style.json'
Также возможна передача объекта:
style: {
version: 8,
sources: {},
layers: []
}
Стиль определяет:
Отсутствие корректного style приводит к пустому рендеру даже при корректной инициализации карты.
center задаёт начальную географическую позицию в формате
[longitude, latitude].
center: [30.31413, 59.93863]
Важно соблюдать порядок координат: сначала долгота, затем широта. Ошибка порядка приводит к смещению отображения в неправильную область мира.
zoom определяет масштаб отображения:
zoom: 12
Помимо базовых параметров, инициализация может включать дополнительные настройки поведения карты.
Ограничивают диапазон масштабирования:
minZoom: 3,
maxZoom: 18
Это полезно при создании специализированных карт, где детализация ограничена данными.
Определяет поворот карты:
bearing: 30
Значение задаётся в градусах по часовой стрелке.
Задаёт наклон камеры:
pitch: 45
Используется для 3D-эффектов, особенно при визуализации зданий.
antialias: true
Включает сглаживание линий и полигонов. Увеличивает качество визуализации, но может снижать производительность.
renderWorldCopies: true
Определяет, будут ли копии мира отображаться при горизонтальном панорамировании.
Инициализация карты не является мгновенной операцией. После создания экземпляра начинается загрузка стиля, источников и ресурсов.
Ключевое событие:
map.on('load', () => {
// карта полностью готова
});
Стадии загрузки включают:
До события load работа с слоями и источниками
ограничена.
MapLibre генерирует события ошибок, которые важно отслеживать:
map.on('error', (e) => {
console.error(e.error);
});
Типичные причины ошибок:
В приложениях с динамическим интерфейсом контейнер может появляться после загрузки DOM.
Корректный подход:
document.addEventListener('DOMContentLoaded', () => {
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [30, 60],
zoom: 5
});
});
Если контейнер создаётся позже (например, в SPA), инициализация должна выполняться после его вставки в DOM.
Экземпляр карты является тяжёлым объектом, связанный с WebGL контекстом. Повторная инициализация без уничтожения предыдущего экземпляра приводит к утечкам ресурсов.
Корректное освобождение:
map.remove();
После вызова remove WebGL контекст уничтожается, а
DOM-узел очищается от canvas.
В некоторых случаях карта создаётся без немедленной загрузки стиля:
const map = new maplibregl.Map({
container: 'map',
center: [0, 0],
zoom: 2,
style: null
});
Позднее стиль может быть установлен:
map.setStyle('https://demotiles.maplibre.org/style.json');
Это используется для сценариев, где стиль зависит от пользовательских настроек или внешних данных.
MapLibre GL работает в Web Mercator по умолчанию, но инициализация
может учитывать нестандартные источники данных через
projection:
maplibregl.setRTLTextPlugin(
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.js'
);
Хотя это не влияет напрямую на конструктор, такие настройки часто выполняются до создания экземпляра карты.
Инициализация карты напрямую связана с:
Оптимизация заключается в минимизации стиля на этапе загрузки и последующей догрузке слоёв через API.
Помимо события load, существует событие
idle, которое сигнализирует о полной стабилизации
рендера:
map.on('idle', () => {
// карта полностью отрисована и не выполняет загрузку
});
Это важно для сценариев автоматизированного тестирования или генерации скриншотов.
Инициализация часто связывается с состоянием приложения:
const map = new maplibregl.Map({
container: 'map',
style: currentThemeStyle,
center: userLocation,
zoom: userZoom
});
Такой подход позволяет синхронизировать карту с:
Изменение стиля после создания карты не требует пересоздания экземпляра:
map.setStyle('https://example.com/new-style.json');
После смены стиля необходимо повторно добавлять пользовательские источники и слои, поскольку они очищаются.
В одностраничных приложениях важно учитывать:
Типичная ошибка — создание нового экземпляра при каждом переходе без
вызова remove.
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [0, 0],
zoom: 2
});
map.on('load', () => {
map.resize();
});