Пунктирные линии в Leaflet реализуются через SVG-атрибут
stroke-dasharray, который доступен через опцию
dashArray в стилях векторных слоёв. Любая линия, созданная
через L.polyline, L.polygon или стилизованная
через GeoJSON, может быть преобразована в пунктирную без
изменения геометрии данных.
Ключевая особенность заключается в том, что пунктир — это не отдельный тип слоя, а модификация визуального представления векторного пути.
Основная опция:
L.polyline(latlngs, {
color: 'blue',
weight: 4,
dashArray: '10, 10'
}).addTo(map);
dashArray принимает строку, где числа задают чередование
штриха и пробела в пикселях:
Векторный слой Leaflet по умолчанию использует SVG-рендерер. В этом
случае каждая линия — это <path> элемент, а пунктир
формируется через:
stroke-dasharray: 10 10;
Внутренне Leaflet преобразует JavaScript-опции в SVG-стили, не требуя ручного управления DOM.
Важно учитывать:
Любой векторный слой поддерживает динамическое обновление стиля:
const line = L.polyline(latlngs, {
color: 'red',
weight: 3
}).addTo(map);
line.setStyle({
dashArray: '5, 15'
});
Метод setStyle полностью пересчитывает SVG-атрибуты без
пересоздания геометрии.
При работе с GeoJSON стиль задаётся через функцию
style:
L.geoJSON(geojsonData, {
style: function (feature) {
return {
color: '#3388ff',
weight: 3,
dashArray: '8, 6'
};
}
}).addTo(map);
Для условного стилизования используются свойства объектов:
style: function (feature) {
return {
dashArray: feature.properties.type === 'border'
? '12, 8'
: '4, 4'
};
}
dashArray допускает более сложные
последовательности:
dashArray: '10, 5, 2, 5'
Интерпретация:
Такая схема используется для создания «технических» линий, контуров или картографических обозначений разного уровня детализации.
Параметр dashOffset позволяет смещать фазу пунктира
вдоль линии:
L.polyline(latlngs, {
color: 'green',
dashArray: '10, 10',
dashOffset: '0'
}).addTo(map);
Изменение dashOffset создаёт эффект движения:
let offset = 0;
setInterval(() => {
offset = (offset + 1) % 20;
line.setStyle({
dashOffset: offset.toString()
});
}, 50);
Механика основана на циклическом сдвиге SVG-паттерна, без изменения координат линии.
Leaflet может использовать два основных рендерера:
В Canvas пунктир реализуется через setLineDash:
ctx.setLineDash([10, 10]);
Leaflet абстрагирует это через единый интерфейс
dashArray, но поведение может отличаться:
При использовании Canvas:
Поэтому для декоративных линий предпочтителен SVG-рендерер.
Пунктирные линии часто используются в динамических сценариях, где стиль зависит от состояния объекта:
function updateState(active) {
line.setStyle({
dashArray: active ? '0' : '8, 6',
color: active ? 'red' : 'gray'
});
}
Значение '0' фактически отключает пунктир, возвращая
сплошную линию.
Пунктирные линии часто комбинируются с изменением прозрачности:
L.polyline(latlngs, {
color: 'blue',
weight: 3,
dashArray: '6, 6',
opacity: 0.7
}).addTo(map);
Такая комбинация используется для второстепенных маршрутов, границ зон или вспомогательных слоёв.
Поскольку dash задаётся в пикселях, при зуме:
Это стандартное поведение SVG, не зависящее от географических координат.
Полигональные слои используют ту же систему:
L.polygon(latlngs, {
color: '#ff7800',
weight: 2,
fillOpacity: 0.2,
dashArray: '5, 5'
}).addTo(map);
Граница полигона визуально отделяется от заливки, сохраняя единый стиль.
Для сложных объектов возможно наложение нескольких линий с разными стилями:
L.polyline(latlngs, {
color: 'black',
weight: 6
}).addTo(map);
L.polyline(latlngs, {
color: 'white',
weight: 3,
dashArray: '8, 6'
}).addTo(map);
Такой приём создаёт контрастный пунктирный эффект поверх основной линии.
При большом количестве линий ключевым фактором становится:
Оптимизация достигается через:
L.layerGroup)setStyle вызововПунктир не влияет на геометрию:
Это делает dash-стили безопасными для аналитических и навигационных данных.
Пунктирные линии часто используются как индикатор состояния взаимодействия:
line.on('mouseover', function () {
this.setStyle({
dashArray: '2, 8'
});
});
line.on('mouseout', function () {
this.setStyle({
dashArray: '10, 10'
});
});
Изменение dash-параметров становится визуальным сигналом активности объекта на карте.