В Mapbox GL JS маркеры представляют собой HTML-элементы, привязанные к координатам карты. Они используются для отображения точек интереса, пользовательских объектов и интерактивных элементов поверх карты.
Основной класс для работы с маркерами — mapboxgl.Marker.
Он создаёт DOM-элемент, который синхронизируется с географическими
координатами.
Ключевые особенности:
layers)Базовый маркер создаётся через конструктор:
const marker = new mapboxgl.Marker()
.setLngLat([30.5, 50.5])
.addTo(map);
Разбор этапов:
new mapboxgl.Marker() — создание экземпляра.setLngLat([lng, lat]) — установка координат.addTo(map) — добавление на картуУдаление маркера:
marker.remove();
Маркеры могут использовать собственный HTML-элемент вместо стандартного синего пина.
const el = document.createElement('div');
el.className = 'custom-marker';
el.style.width = '20px';
el.style.height = '20px';
el.style.backgroundColor = 'red';
el.style.borderRadius = '50%';
const marker = new mapboxgl.Marker(el)
.setLngLat([30.5, 50.5])
.addTo(map);
Подход позволяет:
Конструктор mapboxgl.Marker поддерживает опции:
const marker = new mapboxgl.Marker({
color: '#ff0000',
draggable: true,
rotation: 45,
anchor: 'bottom'
});
Основные параметры:
color — цвет стандартного маркераdraggable — включение перетаскиванияrotation — поворот маркераanchor — точка привязки (center,
top, bottom, left,
right)Маркер может изменять координаты пользователем:
const marker = new mapboxgl.Marker({ draggable: true })
.setLngLat([30.5, 50.5])
.addTo(map);
marker.on('dragend', () => {
const lngLat = marker.getLngLat();
console.log(lngLat);
});
События:
dragstartdragdragendИспользование большого количества Marker приводит к
нагрузке на DOM.
При работе с сотнями и тысячами объектов предпочтительно:
GeoJSON Sourcesymbol layerПример слоя вместо маркеров:
map.addSource('points', {
type: 'geojson',
data: geojsonData
});
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Popup используется для отображения информации поверх
карты, часто в связке с маркерами.
const popup = new mapboxgl.Popup()
.setLngLat([30.5, 50.5])
.setHTML('<h3>Заголовок</h3><p>Описание объекта</p>')
.addTo(map);
const marker = new mapboxgl.Marker()
.setLngLat([30.5, 50.5])
.setPopup(
new mapboxgl.Popup().setText('Информация')
)
.addTo(map);
Поведение:
new mapboxgl.Popup({
closeButton: false,
closeOnClick: false,
offset: 25
});
Параметры:
closeButton — отображение кнопки закрытияcloseOnClick — закрытие при клике по картеoffset — смещение относительно точки привязкиmap.addControl(new mapboxgl.NavigationControl());
Функции:
map.addControl(new mapboxgl.FullscreenControl());
map.addControl(new mapboxgl.ScaleControl({
maxWidth: 200,
unit: 'metric'
}));
map.addControl(new mapboxgl.AttributionControl({
compact: true
}));
Mapbox GL JS позволяет создавать собственные UI-элементы через
интерфейс IControl.
class CustomControl {
onAdd(map) {
this.map = map;
this.container = document.createElement('div');
this.container.className = 'custom-control';
this.container.textContent = 'Overlay';
return this.container;
}
onRemove() {
this.container.parentNode.removeChild(this.container);
this.map = undefined;
}
}
map.addControl(new CustomControl(), 'top-right');
Позиции:
top-lefttop-rightbottom-leftbottom-rightКроме контролов, можно размещать абсолютные HTML-слои:
const overlay = document.createElement('div');
overlay.style.position = 'absolute';
overlay.style.top = '10px';
overlay.style.left = '10px';
overlay.style.background = 'white';
document.body.appendChild(overlay);
Такой подход используется для:
marker.getElement().addEventListener('click', () => {
console.log('clicked');
});
map.on('click', (e) => {
console.log(e.lngLat);
});
marker.setLngLat([31.0, 51.0]);
el.innerHTML = '<strong>New content</strong>';
geojson.features.forEach(feature => {
new mapboxgl.Marker()
.setLngLat(feature.geometry.coordinates)
.setPopup(new mapboxgl.Popup().setText(feature.properties.name))
.addTo(map);
});
При большом количестве точек используется clustering:
map.addSource('points', {
type: 'geojson',
data: data,
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Преимущества:
Все маркеры и overlay используют географические координаты
[longitude, latitude], которые Mapbox GL JS преобразует в
экранные координаты через WebGL-проекцию.
При изменении:
все overlay пересчитываются в соответствии с матрицей камеры карты.