В библиотеке Leaflet полигон представляет собой замкнутую
геометрическую фигуру, задаваемую набором координат широты и долготы.
Основной класс для работы с полигонами — L.polygon, который
позволяет создавать как простые многоугольники, так и сложные формы с
внутренними отверстиями.
Полигон в Leaflet задаётся массивом точек:
const latlngs = [
[51.509, -0.08],
[51.503, -0.06],
[51.51, -0.047]
];
Каждая точка — это пара [lat, lng]. Последняя точка
автоматически соединяется с первой, формируя замкнутую фигуру.
Для более сложных форм используется массив массивов координат.
Создание полигона выполняется через L.polygon:
const polygon = L.polygon(latlngs, {
color: 'blue',
weight: 3,
fillColor: '#3388ff',
fillOpacity: 0.4
}).addTo(map);
Основные параметры:
color — цвет границыweight — толщина линииfillColor — цвет заливкиfillOpacity — прозрачность заливкиПосле создания полигон добавляется на карту через
addTo(map).
Leaflet поддерживает сложные полигоны, состоящие из нескольких внешних и внутренних контуров.
const multiPolygon = [
[
[51.51, -0.12],
[51.53, -0.10],
[51.52, -0.08]
],
[
[51.50, -0.09],
[51.51, -0.07],
[51.49, -0.06]
]
];
L.polygon(multiPolygon, { color: 'red' }).addTo(map);
Каждый вложенный массив представляет отдельный контур.
Поддерживается создание «полигонов с вырезами», где внутренняя область исключается из заливки.
const outer = [
[51.51, -0.12],
[51.53, -0.12],
[51.53, -0.08],
[51.51, -0.08]
];
const hole = [
[51.52, -0.11],
[51.52, -0.09],
[51.515, -0.09]
];
const polygonWithHole = L.polygon([outer, hole], {
color: 'black',
fillColor: 'yellow',
fillOpacity: 0.5
}).addTo(map);
Первый массив — внешний контур, последующие — внутренние отверстия.
Полигон часто создаётся через GeoJSON-структуру:
const geojsonFeature = {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[
[-0.12, 51.51],
[-0.13, 51.52],
[-0.11, 51.53],
[-0.12, 51.51]
]]
}
};
L.geoJSON(geojsonFeature, {
style: {
color: "green",
weight: 2,
fillOpacity: 0.3
}
}).addTo(map);
Важно учитывать порядок координат GeoJSON: [lng, lat], в
отличие от стандартного Leaflet.
Параметры стиля позволяют управлять визуальным отображением:
L.polygon(latlngs, {
stroke: true,
color: '#ff7800',
weight: 4,
opacity: 0.8,
fill: true,
fillColor: '#fffc00',
fillOpacity: 0.2,
dashArray: '10, 5'
}).addTo(map);
Дополнительные параметры:
stroke — включение/выключение границыopacity — прозрачность линииdashArray — пунктирная линияПолигоны поддерживают стандартные события взаимодействия:
polygon.on('click', function (e) {
console.log('Клик по полигону');
});
polygon.on('mouseover', function () {
this.setStyle({ fillOpacity: 0.7 });
});
polygon.on('mouseout', function () {
this.setStyle({ fillOpacity: 0.4 });
});
Доступные события включают:
clickmouseovermouseoutdblclickcontextmenuЛюбой полигон можно динамически изменять:
polygon.setStyle({
color: 'purple',
fillColor: 'pink'
});
Также доступно временное скрытие:
map.removeLayer(polygon);
map.addLayer(polygon);
Координаты полигона доступны через:
const coords = polygon.getLatLngs();
console.log(coords);
Метод возвращает вложенную структуру массивов, соответствующую уровню сложности полигона.
Leaflet позволяет определить, находится ли точка внутри полигона:
const point = L.latLng(51.51, -0.1);
const inside = polygon.getBounds().contains(point);
Метод getBounds() возвращает прямоугольную область,
охватывающую полигон.
При подключении плагинов редактирования (например, Leaflet.draw) полигоны становятся изменяемыми:
polygon.editing.enable();
polygon.editing.disable();
Редактирование включает перетаскивание вершин и изменение формы.
При работе с большим количеством вершин:
simplify() на этапе подготовки данныхmousemoveПолигон отличается от:
Polyline — не замкнутая линияRectangle — частный случай полигона с четырьмя
угламиCircle — параметрическая фигура с радиусомПолигон остаётся универсальной формой для произвольных областей на карте.