В библиотеке Leaflet круги представляют собой геометрические объекты, отображаемые на карте в виде окружностей с фиксированным радиусом в метрах. В отличие от маркеров, которые привязаны к одной точке, круги описывают область пространства и изменяют свой размер при масштабировании карты, сохраняя географическую точность.
Круги реализуются через класс L.circle, который
наследуется от базового слоя Path. Это означает, что они
обладают всеми возможностями векторной графики Leaflet: стилизацией,
обработкой событий, привязкой всплывающих окон и подсказок.
Базовая конструкция круга задаётся координатами центра и радиусом:
L.circle([55.751244, 37.618423], {
radius: 1000
}).addTo(map);
Первый аргумент — географические координаты центра
[lat, lng]. Второй — объект настроек, где ключевым
параметром является radius, измеряемый в
метрах.
Круг автоматически пересчитывается при зуме карты, так как радиус интерпретируется в географических единицах, а не в пикселях.
Объект настроек поддерживает те же стилистические свойства, что и полилинии и полигоны:
color — цвет обводкиweight — толщина линииopacity — прозрачность обводкиfillColor — цвет заливкиfillOpacity — прозрачность заливкиdashArray — пунктирная линияlineCap, lineJoin — стиль соединений
линийПример комбинированной стилизации:
L.circle([55.75, 37.61], {
radius: 2000,
color: '#2c3e50',
weight: 2,
fillColor: '#3498db',
fillOpacity: 0.3
}).addTo(map);
Радиус круга интерпретируется в метрах и зависит от используемой проекции карты. Leaflet использует Web Mercator, где расстояния искажаются на высоких широтах, однако для большинства задач визуализации (зоны покрытия, радиусы поиска, области влияния) погрешность остаётся допустимой.
Ключевая особенность:
В Leaflet существует два похожих объекта: L.circle и
L.circleMarker.
Пример CircleMarker:
L.circleMarker([55.751244, 37.618423], {
radius: 10
}).addTo(map);
Различие принципиально: Circle описывает реальную
область на карте, CircleMarker — экранный элемент
интерфейса.
Созданный круг представляет собой слой (Layer), который
можно динамически изменять.
circle.setRadius(5000);
circle.setLatLng([55.76, 37.64]);
circle.getRadius();
circle.getLatLng();
Круги поддерживают стандартную систему событий Leaflet:
clickmouseovermouseoutmousedownmouseupПример обработки клика:
circle.on('click', function (e) {
console.log('Круг нажат', e.latlng);
});
События позволяют использовать круги как интерактивные зоны: выделение областей, отображение информации, запуск логики приложения.
Круги поддерживают привязку popups и tooltips:
L.circle([55.75, 37.61], {
radius: 1500
})
.bindPopup('Зона покрытия')
.addTo(map);
Tooltip:
circle.bindTooltip('Радиус 1500 м');
Popup открывается по клику, tooltip — при наведении.
Circle не является стандартной GeoJSON-геометрией, однако Leaflet
позволяет представлять его через Point с дополнительными
свойствами.
Пример создания из GeoJSON:
L.geoJSON(feature, {
pointToLayer: function (feature, latlng) {
return L.circle(latlng, {
radius: feature.properties.radius
});
}
}).addTo(map);
Таким образом, радиус может храниться в свойствах объекта данных и динамически интерпретироваться.
Круги часто используются в задачах, где радиус зависит от внешних параметров: плотности населения, мощности сигнала, времени доставки.
Пример обновления в цикле:
function updateCircle(value) {
circle.setRadius(value);
}
При изменении данных перерисовка происходит мгновенно без пересоздания слоя.
Круг является полноценным слоем и участвует в системе управления слоями Leaflet:
circle.addTo(map);
map.removeLayer(circle);
Также он может быть включён в группы:
const group = L.layerGroup([circle1, circle2]);
group.addTo(map);
Это важно при работе с большим количеством геометрии.
При большом числе кругов (сотни и тысячи) производительность зависит от:
fillOpacity,
fillColor)Leaflet по умолчанию использует SVG, однако при масштабных данных возможен переход на Canvas:
const map = L.map('map', {
preferCanvas: true
});
Canvas-рендерер снижает нагрузку при массовом отображении кругов.
Параметры круга могут задаваться динамически:
function getColor(radius) {
return radius > 1000 ? 'red' : 'green';
}
L.circle([55.75, 37.61], {
radius: 2000,
color: getColor(2000)
}).addTo(map);
Такой подход используется при визуализации аналитических данных.
Круги применяются для моделирования пространственных областей:
Каждый круг выступает как визуальное представление числовой модели.
Состояние круга может меняться при событиях:
circle.on('mouseover', function () {
this.setStyle({
fillOpacity: 0.6
});
});
circle.on('mouseout', function () {
this.setStyle({
fillOpacity: 0.3
});
});
Метод setStyle доступен благодаря наследованию от
Path.
Круги часто используются совместно с маркерами:
L.marker([55.75, 37.61]).addTo(map);
L.circle([55.75, 37.61], { radius: 1000 }).addTo(map);
Маркер обозначает точку, круг — область вокруг неё. Такое сочетание формирует базовую структуру пространственной визуализации.
Leaflet не предоставляет встроенной анимации, но изменение радиуса может быть реализовано через интерполяцию:
let r = 100;
const interval = setInterval(() => {
r += 100;
circle.setRadius(r);
if (r >= 2000) clearInterval(interval);
}, 100);
Это используется для визуализации распространения сигналов или волн.
При создании наборов кругов часто используется генерация:
const centers = [
[55.75, 37.61],
[55.76, 37.62],
[55.74, 37.60]
];
centers.forEach(c => {
L.circle(c, {
radius: 800
}).addTo(map);
});
Такие структуры формируют плотностные зоны или кластеры покрытия.