Прямоугольники в Leaflet представляют собой частный случай
прямоугольных геометрических объектов на карте, реализуемых через класс
L.Rectangle. Внутри библиотеки они являются наследниками
слоя Polygon, а их геометрия строго определяется двумя
диагонально противоположными точками, которые формируют границы типа
LatLngBounds.
В основе прямоугольника лежит объект границ:
const bounds = L.latLngBounds(
L.latLng(55.75, 37.50),
L.latLng(55.70, 37.60)
);
Эти границы описывают минимальный прямоугольный регион, охватывающий две координаты. Независимо от порядка точек, Leaflet автоматически нормализует их, вычисляя северо-западный и юго-восточный углы.
Прямоугольник создаётся на основе этих границ:
const rectangle = L.rectangle(bounds);
rectangle.addTo(map);
Базовая форма инициализации поддерживает несколько вариантов входных данных:
L.rectangle(bounds).addTo(map);
или с явным указанием стиля:
L.rectangle(bounds, {
color: "#ff7800",
weight: 2,
fillOpacity: 0.3
}).addTo(map);
Параметры стиля совпадают с параметрами полигона, поскольку прямоугольник является его частным случаем.
Ключевой объект для управления прямоугольником —
LatLngBounds. Он предоставляет методы:
getNorth(), getSouth()getEast(), getWest()getNorthWest(), getSouthEast()Прямоугольник всегда синхронизирован с этими значениями. Изменение границ требует пересоздания или обновления слоя:
rectangle.setBounds(
L.latLngBounds(
[55.8, 37.4],
[55.6, 37.7]
)
);
Прямоугольник поддерживает полный набор стилевых опций Path:
const rectangle = L.rectangle(bounds, {
stroke: true,
color: "#3388ff",
weight: 3,
opacity: 1,
fill: true,
fillColor: "#3388ff",
fillOpacity: 0.2,
dashArray: "5, 10",
lineJoin: "round"
});
Особое значение имеет fillOpacity, так как
прямоугольники часто используются для выделения областей на карте без
перекрытия визуального контекста.
Прямоугольники могут реагировать на пользовательские события, так же как и любые другие слои:
rectangle.on("click", function (e) {
console.log("Клик по прямоугольнику:", e.latlng);
});
Поддерживаются события:
clickmouseovermouseoutmousedownmouseupcontextmenuПри необходимости можно включить всплывающие окна:
rectangle.bindPopup("Выбранная область");
Добавление и удаление прямоугольника происходит через стандартные методы слоя:
rectangle.addTo(map);
rectangle.remove();
Проверка наличия на карте:
map.hasLayer(rectangle);
Замена слоя или обновление часто используется при динамическом изменении области интереса.
Прямоугольник не имеет встроенного механизма “перетаскивания углов” без дополнительных плагинов, но его можно полностью пересоздавать или обновлять через новые границы:
const newBounds = rectangle.getBounds().pad(0.1);
rectangle.setBounds(newBounds);
Метод pad() расширяет границы на заданный коэффициент,
создавая визуальный эффект увеличения области.
Одна из ключевых операций — автоматическое масштабирование карты под прямоугольник:
map.fitBounds(rectangle.getBounds());
Этот механизм используется для фокусировки на выделенной области. Он вычисляет оптимальный зум и центр карты.
Хотя прямоугольник не содержит встроенной логики геометрических
пересечений уровня GIS, базовые операции выполняются через
LatLngBounds:
const bounds1 = rectangle.getBounds();
const bounds2 = L.latLngBounds([55.72, 37.55], [55.68, 37.65]);
const intersects =
bounds1.overlaps(bounds2);
Также доступна проверка включения точки:
bounds1.contains([55.74, 37.58]);
Прямоугольники могут быть конвертированы в GeoJSON-совместимый формат через полигоны:
const geojson = rectangle.toGeoJSON();
Результирующая структура будет представлять собой
Polygon с четырьмя координатами, замыкающими контур.
Обратное преобразование:
L.geoJSON(geojson).addTo(map);
В базовой версии библиотеки редактирование не включено, но через плагины (например, leaflet.pm или Leaflet.draw) прямоугольники становятся интерактивными:
При редактировании изменяется объект LatLngBounds, после
чего слой перерисовывается.
Прямоугольники являются лёгкими в рендеринге объектами, поскольку состоят из фиксированного числа точек (обычно 5, включая замыкание контура). Это делает их предпочтительными для:
При большом количестве прямоугольников важно учитывать:
pane для управления слоямиinteractive: false)LayerGroupПрямоугольники часто используются вместе с маркерами и полигонами:
const group = L.layerGroup([
rectangle,
L.marker([55.72, 37.58])
]).addTo(map);
Это позволяет формировать логические зоны данных, объединяя визуальные элементы.
Leaflet не предоставляет встроенной анимации прямоугольников, но их можно обновлять через изменение bounds в таймере:
setInterval(() => {
const b = rectangle.getBounds();
rectangle.setBounds(b.pad(0.01));
}, 1000);
Такой подход используется для визуализации растущих зон или областей поиска.