Marker представляет собой базовый интерактивный объект для размещения DOM-элемента на карте в координатах долготы и широты. В MapLibre GL JS маркеры используются для обозначения точек интереса, пользовательских объектов, динамических данных и интерактивных элементов интерфейса поверх векторной карты.
Marker не является частью WebGL-рендеринга. Он создаётся как HTML-элемент, позиционируемый поверх карты, и синхронизируется с её трансформациями (pan, zoom, rotate). Это обеспечивает гибкость визуализации и возможность использования произвольной разметки и стилей.
Создание маркера выполняется через конструктор
maplibregl.Marker:
const marker = new maplibregl.Marker();
marker.setLngLat([30.5, 50.5]).addTo(map);
Ключевые этапы:
setLngLataddToMarker не отображается до момента привязки к экземпляру карты.
Конструктор Marker принимает объект настроек, определяющий поведение и внешний вид:
const marker = new maplibregl.Marker({
color: "#ff0000",
draggable: true,
anchor: "bottom",
offset: [0, -10]
});
Основные параметры:
Marker поддерживает полную замену стандартного DOM-элемента:
const el = document.createElement("div");
el.className = "custom-marker";
el.style.width = "20px";
el.style.height = "20px";
el.style.background = "blue";
el.style.borderRadius = "50%";
const marker = new maplibregl.Marker({
element: el
})
.setLngLat([30.5, 50.5])
.addTo(map);
Пользовательский элемент позволяет:
Метод setLngLat определяет географическое положение
маркера:
marker.setLngLat([longitude, latitude]);
Формат координат строго фиксирован:
Marker автоматически пересчитывает экранные координаты при изменении состояния карты.
Получение текущего положения:
const lngLat = marker.getLngLat();
Результат возвращает объект:
{ lng: number, lat: number }
Добавление маркера:
marker.addTo(map);
Удаление маркера:
marker.remove();
Повторное добавление после удаления возможно без пересоздания экземпляра.
При включении draggable: true активируется возможность
изменения координат пользователем:
const marker = new maplibregl.Marker({
draggable: true
})
.setLngLat([30.5, 50.5])
.addTo(map);
Перетаскивание сопровождается событиями:
marker.on("dragstart", () => {});
marker.on("drag", () => {});
marker.on("dragend", () => {});
После завершения перетаскивания координаты можно получить через
getLngLat.
Marker поддерживает событийную модель:
clickdragstartdragdragendmousedownmouseupПример обработки:
marker.on("click", (e) => {
console.log("Marker clicked");
});
События проксируются через DOM-слой маркера.
Marker может быть связан с Popup:
const popup = new maplibregl.Popup()
.setText("Информация об объекте");
marker.setPopup(popup);
При клике на маркер Popup открывается автоматически.
Получение привязанного Popup:
const popup = marker.getPopup();
Метод getElement возвращает DOM-ноду:
const el = marker.getElement();
el.style.border = "2px solid red";
Это позволяет динамически изменять внешний вид маркера после его создания.
Anchor определяет точку привязки элемента относительно координаты:
centertopbottomleftrighttop-left,
bottom-right)Пример:
new maplibregl.Marker({
anchor: "bottom"
});
При изменении anchor смещается точка привязки, что влияет на визуальное положение относительно координаты.
Offset используется для пиксельной корректировки:
new maplibregl.Marker({
offset: [10, -20]
});
Первое значение — смещение по X, второе — по Y.
Применяется для:
Marker создаёт отдельные DOM-узлы для каждого экземпляра. При большом количестве объектов возможны ограничения производительности:
Для больших наборов данных часто используется символический слой
(SymbolLayer) вместо Marker.
Marker:
Layer (SymbolLayer):
Типичный жизненный цикл включает:
Marker сохраняет состояние независимо от карты до явного удаления.
Положение может изменяться в реальном времени:
setInterval(() => {
const lng = 30 + Math.random();
const lat = 50 + Math.random();
marker.setLngLat([lng, lat]);
}, 1000);
MapLibre автоматически пересчитывает экранное положение без пересоздания DOM.
Marker часто используется для отображения данных из API:
Обновление маркеров обычно синхронизируется с потоками данных через
setLngLat и изменение DOM-элемента.
При большом количестве маркеров применяется управление коллекциями:
const markers = [];
data.forEach(point => {
const marker = new maplibregl.Marker()
.setLngLat(point.coords)
.addTo(map);
markers.push(marker);
});
Для очистки:
markers.forEach(m => m.remove());
Управление массивами маркеров требует контроля жизненного цикла объектов для предотвращения утечек памяти.