Класс Map является центральным объектом библиотеки
MapLibre GL JS. Через него выполняется создание карты, управление
отображением данных, настройка взаимодействия пользователя, работа со
слоями, источниками данных, событиями, анимацией и камерой.
Практически любой сценарий работы с MapLibre начинается с создания
экземпляра класса Map.
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [37.6176, 55.7558],
zoom: 10
});
После создания объекта становится доступен широкий набор методов и свойств для управления картой.
Конструктор принимает объект настроек.
const map = new maplibregl.Map(options);
Наиболее часто используемые параметры:
| Параметр | Описание |
|---|---|
container |
HTML-элемент или его идентификатор |
style |
URL стиля или объект стиля |
center |
Начальные координаты центра |
zoom |
Начальный масштаб |
bearing |
Угол поворота карты |
pitch |
Наклон карты |
hash |
Синхронизация состояния карты с URL |
interactive |
Разрешение взаимодействия пользователя |
antialias |
Сглаживание WebGL |
maxZoom |
Максимальный масштаб |
minZoom |
Минимальный масштаб |
Пример полной конфигурации:
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [30.3141, 59.9386],
zoom: 12,
pitch: 45,
bearing: 20,
minZoom: 5,
maxZoom: 18,
antialias: true
});
Каждая карта должна быть привязана к DOM-элементу.
HTML:
<div id="map"></div>
CSS:
#map {
width: 100%;
height: 600px;
}
Jav * aScript:
const map = new maplibregl.Map({
container: 'map',
style: styleUrl
});
Допускается передача самого элемента:
const container = document.getElementById('map');
const map = new maplibregl.Map({
container
});
Камера определяет текущее положение наблюдателя.
Координаты центра карты.
center: [37.6176, 55.7558]
Получение текущего центра:
const center = map.getCenter();
console.log(center.lng);
console.log(center.lat);
Изменение центра:
map.setCenter([30.3141, 59.9386]);
Уровень масштабирования.
zoom: 8
Получение текущего масштаба:
const zoom = map.getZoom();
Установка нового масштаба:
map.setZoom(12);
Поворот карты относительно севера.
bearing: 45
Получение значения:
const bearing = map.getBearing();
Изменение:
map.setBearing(90);
Наклон карты.
pitch: 60
Получение:
const pitch = map.getPitch();
Изменение:
map.setPitch(45);
Мгновенно изменяет положение карты.
map.jumpTo({
center: [37.6176, 55.7558],
zoom: 12
});
Переход происходит без анимации.
Плавное перемещение камеры.
map.easeTo({
center: [37.6176, 55.7558],
zoom: 13,
duration: 3000
});
Основные параметры:
| Параметр | Описание |
|---|---|
center |
Новый центр |
zoom |
Новый масштаб |
bearing |
Новый угол |
pitch |
Новый наклон |
duration |
Продолжительность |
Имитация полёта камеры.
map.flyTo({
center: [37.6176, 55.7558],
zoom: 14
});
Часто используется для навигации между удалёнными объектами.
map.flyTo({
center: [2.3522, 48.8566],
zoom: 12,
speed: 0.8,
curve: 1.5
});
Подгоняет область просмотра под заданный прямоугольник.
map.fitBounds([
[37.55, 55.70],
[37.75, 55.85]
]);
С отступами:
map.fitBounds(
[
[37.55, 55.70],
[37.75, 55.85]
],
{
padding: 50
}
);
const zoom = map.getZoom();
const center = map.getCenter();
const pitch = map.getPitch();
const bearing = map.getBearing();
const bounds = map.getBounds();
Пример:
console.log(bounds.getWest());
console.log(bounds.getEast());
console.log(bounds.getNorth());
console.log(bounds.getSouth());
После изменения размеров контейнера необходимо уведомить карту.
map.resize();
Типичный пример:
window.addEventListener('resize', () => {
map.resize();
});
Также метод используется после открытия боковых панелей, вкладок и модальных окон.
const style = map.getStyle();
map.setStyle(
'https://demotiles.maplibre.org/style.json'
);
После смены стиля источники и слои, добавленные программно, обычно необходимо создавать заново.
Источник данных представляет набор объектов, используемых слоями.
Добавление GeoJSON-источника:
map.addSource('cities', {
type: 'geojson',
data: 'cities.geojson'
});
Локальные данные:
map.addSource('cities', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
const source = map.getSource('cities');
Проверка:
if (map.getSource('cities')) {
console.log('Источник существует');
}
map.removeSource('cities');
Перед удалением необходимо удалить связанные слои.
Слой определяет способ отображения данных.
Добавление слоя:
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
const layer = map.getLayer('cities-layer');
if (map.getLayer('cities-layer')) {
console.log('Слой найден');
}
map.removeLayer('cities-layer');
map.moveLayer('cities-layer');
Размещение перед другим слоем:
map.moveLayer(
'cities-layer',
'roads-layer'
);
Изменение визуального оформления.
map.setPaintProperty(
'cities-layer',
'circle-color',
'#00ff00'
);
Изменение радиуса:
map.setPaintProperty(
'cities-layer',
'circle-radius',
10
);
Изменение параметров компоновки.
map.setLayoutProperty(
'cities-layer',
'visibility',
'none'
);
Показ слоя:
map.setLayoutProperty(
'cities-layer',
'visibility',
'visible'
);
Поиск объектов, которые отображаются на экране.
const features =
map.queryRenderedFeatures();
Поиск в определённой точке:
const features =
map.queryRenderedFeatures(
[300, 200]
);
Поиск по слоям:
const features =
map.queryRenderedFeatures({
layers: ['cities-layer']
});
Получение объектов непосредственно из источника.
const features =
map.querySourceFeatures(
'cities'
);
Данный метод не зависит от текущего отображения карты.
Класс Map наследует систему событий.
Подписка:
map.on('click', (event) => {
console.log(event.lngLat);
});
Отписка:
map.off('click', handler);
Однократное выполнение:
map.once('load', () => {
console.log('Карта загружена');
});
Полная загрузка карты.
map.on('load', () => {
console.log('Ready');
});
Щелчок мышью.
map.on('click', (e) => {
console.log(e.lngLat);
});
Двойной щелчок.
map.on('dblclick', (e) => {
console.log(e.point);
});
Движение указателя.
map.on('mousemove', (e) => {
console.log(e.lngLat);
});
Любое перемещение карты.
map.on('move', () => {
console.log(map.getCenter());
});
Изменение масштаба.
map.on('zoom', () => {
console.log(map.getZoom());
});
Поворот карты.
map.on('rotate', () => {
console.log(map.getBearing());
});
Изменение наклона.
map.on('pitch', () => {
console.log(map.getPitch());
});
Срабатывает после завершения всех операций рендеринга.
map.on('idle', () => {
console.log('Карта полностью готова');
});
Добавление навигации:
map.addControl(
new maplibregl.NavigationControl()
);
Добавление полноэкранного режима:
map.addControl(
new maplibregl.FullscreenControl()
);
Добавление геолокации:
map.addControl(
new maplibregl.GeolocateControl()
);
Размещение в конкретной позиции:
map.addControl(
new maplibregl.NavigationControl(),
'top-right'
);
Доступные позиции:
top-lefttop-rightbottom-leftbottom-rightПреобразует географические координаты в пиксели.
const point = map.project([
37.6176,
55.7558
]);
Результат:
console.log(point.x);
console.log(point.y);
Преобразует экранные координаты в географические.
const lngLat = map.unproject([
500,
300
]);
Проверяет завершение загрузки.
if (map.loaded()) {
console.log('Карта загружена');
}
Проверяет готовность стиля.
if (map.isStyleLoaded()) {
console.log('Стиль загружен');
}
Проверяет наличие движения камеры.
if (map.isMoving()) {
console.log('Карта перемещается');
}
Проверяет изменение масштаба.
if (map.isZooming()) {
console.log('Выполняется масштабирование');
}
Проверяет вращение карты.
if (map.isRotating()) {
console.log('Карта вращается');
}
При удалении компонента интерфейса рекомендуется освобождать ресурсы.
map.remove();
После вызова метода:
Особенно важно вызывать remove() в SPA-приложениях на
React, Vue, Angular и других фреймворках для предотвращения утечек
памяти.
Ниже приведён пример создания карты с источником данных, слоем и анимированным перемещением камеры.
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [37.6176, 55.7558],
zoom: 9
});
map.on('load', () => {
map.addSource('city', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [
37.6176,
55.7558
]
}
}
});
map.addLayer({
id: 'city-layer',
type: 'circle',
source: 'city',
paint: {
'circle-radius': 10,
'circle-color': '#ff0000'
}
});
map.flyTo({
center: [37.6176, 55.7558],
zoom: 12,
pitch: 45,
bearing: 30,
duration: 4000
});
});
Класс Map представляет собой основу всей архитектуры
MapLibre GL JS. Через него осуществляется управление камерой, стилями,
источниками данных, слоями, событиями, пользовательским взаимодействием,
анимацией и жизненным циклом картографического приложения. Чем глубже
используется функциональность MapLibre, тем более центральную роль
занимает объект карты, выступающий единым координатором всех компонентов
визуализации геоданных.