Класс Circle

Leaflet представляет объектно-ориентированную модель работы с геометрическими слоями, где каждый тип примитивной геометрии инкапсулирован в отдельный класс. Класс Circle используется для отображения окружностей на карте в географических координатах и является частным случаем векторного слоя, наследующего базовую функциональность от Layer и Path.

Круг в Leaflet задаётся как геометрическая фигура с центром в координатах широты и долготы и радиусом в метрах. В отличие от HTML Canvas или SVG в абстрактном виде, Circle привязан к картографической проекции, поэтому его размер на экране динамически изменяется в зависимости от масштаба карты.

Circle определяется тремя ключевыми параметрами: центр, радиус и набор визуальных опций. Центр задаётся объектом LatLng, радиус — числом в метрах. Это принципиально отличает Circle от пиксельных примитивов.

При изменении масштаба карты радиус пересчитывается в экранные пиксели, что обеспечивает географическую корректность отображения. Это означает, что круг всегда соответствует фиксированному расстоянию на поверхности Земли, а не фиксированному размеру на экране.

Класс Circle оптимизирован для отображения зон покрытия, радиусов поиска, областей влияния и других пространственных измерений, где критична метрическая точность.

Создание экземпляра Circle

Circle создаётся через фабричный метод слоя карты:

L.circle(latlng, options).addTo(map);

или через явный конструктор:

const circle = new L.Circle([55.751244, 37.618423], {
    radius: 1000
}).addTo(map);

Первый аргумент — координаты центра. Второй — объект параметров, содержащий радиус и стилизацию.

Параметры конфигурации

Circle поддерживает расширенный набор опций, унаследованных от Path:

  • radius — радиус в метрах (обязательный параметр)
  • color — цвет обводки
  • weight — толщина линии
  • opacity — прозрачность обводки
  • fillColor — цвет заливки
  • fillOpacity — прозрачность заливки
  • dashArray — пунктирная линия
  • lineCap и lineJoin — стили соединений линий

Пример комплексной конфигурации:

L.circle([55.75, 37.61], {
    radius: 2000,
    color: '#3388ff',
    weight: 2,
    fillColor: '#3388ff',
    fillOpacity: 0.2
}).addTo(map);

Внутренне Circle использует PathRenderer (SVG или Canvas в зависимости от окружения), что влияет на производительность при большом количестве объектов.

Методы класса Circle

Circle расширяет функциональность базового Path и добавляет специализированные методы работы с радиусом.

setRadius

Изменяет радиус окружности:

circle.setRadius(5000);

После вызова происходит автоматический перерасчёт геометрии и перерисовка слоя.

getRadius

Возвращает текущий радиус в метрах:

const r = circle.getRadius();

getLatLng / setLatLng

Работа с центром окружности:

circle.setLatLng([55.76, 37.64]);
const center = circle.getLatLng();

При изменении центра сохраняется текущий радиус.

setStyle

Позволяет динамически обновлять визуальные параметры:

circle.setStyle({
    color: 'red',
    fillOpacity: 0.5
});

Метод не влияет на геометрию, только на отображение.

bringToFront / bringToBack

Управление z-index внутри слоя:

circle.bringToFront();

Используется при перекрытии нескольких геометрических объектов.

События Circle

Circle поддерживает полный набор событий Leaflet, унаследованных от Layer:

  • click
  • dblclick
  • mousedown / mouseup
  • mouseover / mouseout
  • contextmenu

Пример обработки события:

circle.on('click', function (e) {
    console.log('Клик по окружности', e.latlng);
});

События передают координаты точки взаимодействия и объект слоя.

Отличие Circle от CircleMarker

В Leaflet существует два визуально похожих класса: Circle и CircleMarker, но их поведение принципиально различается.

Circle

  • радиус измеряется в метрах
  • изменяется при масштабировании карты
  • используется для географически точных зон

CircleMarker

  • радиус измеряется в пикселях
  • не зависит от масштаба
  • используется для UI-маркеров и точечных индикаторов
L.circleMarker([55.75, 37.61], { radius: 10 }).addTo(map);
L.circle([55.75, 37.61], { radius: 1000 }).addTo(map);

Первый остаётся фиксированным на экране, второй сохраняет географическую корректность.

Внутреннее устройство и рендеринг

Circle реализуется через Path-абстракцию, которая преобразует географические координаты в экранные пиксели с использованием проекции карты. При каждом изменении масштаба выполняется пересчёт радиуса в пиксели.

Если используется SVG-рендерер, Circle представляется элементом <path>, описывающим окружность через SVG-дуги. При Canvas-рендеринге используется API отрисовки 2D-контекста.

Производительность Circle зависит от:

  • количества окружностей на карте
  • частоты обновления координат
  • типа рендерера (SVG или Canvas)

Взаимодействие с геометрией карты

Circle интегрируется с системой слоёв Leaflet и участвует в общей системе трансформации координат.

Он поддерживает методы:

  • addTo(map)
  • remove()
  • removeFrom(map)

а также геометрические вычисления через LatLngBounds:

const bounds = circle.getBounds();

Bounds рассчитывается как минимальный прямоугольник, описывающий окружность.

Использование в пространственном анализе

Circle часто применяется для:

  • визуализации радиуса поиска объектов
  • обозначения зоны покрытия (например, сети)
  • анализа доступности объектов инфраструктуры
  • отображения погрешности GPS-координат

При этом геометрическая точность обеспечивается переводом радиуса из метров в координатную систему WGS84 с учётом проекции карты.

Совместимость с другими слоями

Circle может комбинироваться с:

  • Marker
  • Polygon
  • Polyline
  • GeoJSON-слоями

Он поддерживает наложение, прозрачность и порядок отрисовки, что позволяет строить сложные визуальные сцены.

Производительность при масштабировании

При увеличении числа Circle на карте возрастает нагрузка на пересчёт геометрии. Векторный рендеринг SVG может становиться узким местом, тогда как Canvas-режим обеспечивает более стабильную отрисовку.

Оптимизация достигается через:

  • группировку слоёв
  • уменьшение частоты обновлений
  • использование CircleMarker вместо Circle при отсутствии необходимости метрической точности

Официальная документация

Leaflet Official Website