CircleMarker в Leaflet представляет собой векторный
слой, отображающий круг на карте с радиусом, заданным в пикселях экрана.
Это ключевое отличие от обычного Circle, радиус которого
задаётся в метрах и привязан к географическому масштабу.
Основная особенность CircleMarker:
LatLngТакой подход делает CircleMarker удобным для
отображения:
Базовый синтаксис:
L.circleMarker(latlng, options)
или через конструктор:
new L.CircleMarker(latlng, options)
const marker = L.circleMarker([55.751244, 37.618423], {
radius: 10,
color: '#3388ff',
weight: 2,
fillColor: '#3388ff',
fillOpacity: 0.5
}).addTo(map);
| Свойство | Circle | CircleMarker |
|---|---|---|
| Радиус | метры | пиксели |
| Масштабирование | изменяется с zoom | фиксированный размер |
| Геометрический смысл | географический радиус | экранная точка |
| Использование | зоны, покрытия | маркеры, события |
CircleMarker наследует опции от Path и добавляет
специфические параметры.
{
radius: 10, // радиус в пикселях
stroke: true, // отображать обводку
color: '#3388ff', // цвет обводки
weight: 3, // толщина линии
opacity: 1.0, // прозрачность обводки
fill: true, // заливка
fillColor: '#3388ff', // цвет заливки
fillOpacity: 0.2, // прозрачность заливки
lineCap: 'round', // стиль концов линии
lineJoin: 'round', // соединение линий
dashArray: null, // пунктирная линия
dashOffset: null, // смещение штриха
interactive: true // интерактивность слоя
}
L.circleMarker([51.5, -0.09], {
radius: 20
}).addTo(map);
Это поведение критично для интерфейсных слоёв, где важна консистентность отображения.
const circle = L.circleMarker([48.8566, 2.3522], {
radius: 8,
color: 'red',
fillColor: 'red',
fillOpacity: 0.6
});
circle.addTo(map);
или сразу:
L.circleMarker([48.8566, 2.3522], {
radius: 8
}).addTo(map);
CircleMarker поддерживает стандартные события
Leaflet:
circle.on('click', function (e) {
console.log('Клик по CircleMarker');
});
clickmouseovermouseoutmousedownmouseupcontextmenucircle.on('mouseover', () => {
circle.setStyle({
fillColor: 'orange'
});
});
circle.on('mouseout', () => {
circle.setStyle({
fillColor: 'red'
});
});
Метод setStyle позволяет динамически менять внешний
вид:
circle.setStyle({
color: 'green',
fillColor: 'green',
fillOpacity: 0.4
});
Особенность:
circle.setRadius(15);
console.log(circle.getRadius());
setRadius(value) — изменение радиусаgetRadius() — получение текущего значенияcircle.bindPopup('Объект на карте');
circle.bindTooltip('Точка интереса', {
direction: 'top'
});
CircleMarker часто применяется для визуализации
данных:
const points = [
[55.75, 37.61],
[55.76, 37.64],
[55.72, 37.58]
];
points.forEach(p => {
L.circleMarker(p, {
radius: 6,
color: '#2c7bb6',
fillOpacity: 0.7
}).addTo(map);
});
Часто радиус зависит от значения:
function getRadius(value) {
return Math.sqrt(value) * 2;
}
L.circleMarker([55.75, 37.61], {
radius: getRadius(100)
}).addTo(map);
Такой подход используется для:
CircleMarker относится к SVG/VML (в зависимости от
браузера), что влияет на производительность:
Особенности:
Хотя радиус фиксирован, позиция всегда пересчитывается:
Это делает CircleMarker удобным для UI-слоёв, но не для
географических зон.
circle.remove();
или
map.removeLayer(circle);
Проверка наличия на карте:
map.hasLayer(circle);
Для управления перекрытием:
circle.setZIndexOffset(1000);
Используется, когда:
L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 5,
fillColor: '#ff7800',
color: '#000',
weight: 1,
fillOpacity: 0.8
});
}
}).addTo(map);
При увеличении zoom:
Это может приводить к эффектам:
CircleMarker создаётся как SVG circle элемент:
zoomendcx, cy,
rВ Canvas-режиме поведение аналогично, но через рисование на контексте.
CircleMarker наследуется по цепочке:
LayerInteractive layerPathCircleMarkerЭто даёт: