Масштабная линейка в Leaflet реализуется через встроенный контрол, который отображает текущий масштаб карты в виде графической шкалы с подписью расстояний. Этот элемент относится к стандартным UI-компонентам карты и служит для визуальной оценки расстояний в реальном мире при изменении зума или центра карты.
Масштабная линейка динамически пересчитывает отображаемую длину отрезка на экране в зависимости от текущего уровня масштабирования карты. В основе лежит преобразование пикселей в метры (или футы) с учётом проекции карты и текущей широты, поскольку масштаб в Leaflet не является линейным по всей поверхности карты.
При изменении масштаба карты контрол пересчитывает:
Масштабная линейка создаётся через L.control.scale и
добавляется на карту как обычный контрол.
const map = L.map('map').setView([51.505, -0.09], 13);
L.control.scale().addTo(map);
После добавления на карту элемент появляется в левом нижнем углу по умолчанию и начинает автоматически реагировать на изменения масштаба.
Контрол принимает объект настроек, который позволяет управлять отображением и поведением шкалы.
positionОпределяет расположение элемента на карте.
Возможные значения:
toplefttoprightbottomleftbottomrightПример:
L.control.scale({
position: 'bottomright'
}).addTo(map);
metricУправляет отображением метрической системы измерения.
true — отображаются метры и километрыfalse — отключает метрическую шкалуL.control.scale({
metric: true
}).addTo(map);
imperialУправляет отображением имперской системы измерения.
true — отображаются футы и милиfalse — отключает имперскую шкалуL.control.scale({
imperial: true
}).addTo(map);
Комбинация параметров позволяет выводить одну или обе шкалы одновременно.
При включении обеих систем шкала отображает два уровня:
L.control.scale({
metric: true,
imperial: true
}).addTo(map);
maxWidthОпределяет максимальную ширину масштабной линейки в пикселях. Используется для предотвращения чрезмерного расширения элемента на больших масштабах.
L.control.scale({
maxWidth: 200
}).addTo(map);
Алгоритм Leaflet автоматически подбирает удобное округлённое значение расстояния, не превышающее заданную ширину.
Контрол пересчитывает значение шкалы при событиях:
zoom)move)Внутренне используется пересчёт географической широты центра карты, поскольку реальный масштаб зависит от положения на сфере.
Leaflet использует сферическую модель Земли. Расстояние между пикселями и метрами вычисляется с учётом:
Приближённая зависимость:
Именно поэтому шкала всегда динамическая и не фиксированная.
После добавления на карту создаётся DOM-структура вида:
Каждая часть обновляется независимо при изменении состояния карты.
Контрол использует стандартные классы Leaflet:
.leaflet-control-scale.leaflet-control-scale-lineПример изменения внешнего вида:
.leaflet-control-scale-line {
background: rgba(255, 255, 255, 0.8);
border: 2px solid #444;
color: #222;
font-size: 12px;
padding: 2px 5px;
}
Изменение стилей не влияет на вычисление масштаба, так как логика отделена от визуального слоя.
При малом масштабе (приближённая карта):
При среднем масштабе:
При большом масштабе (отдалённый вид):
Leaflet автоматически выбирает «красивые» значения из набора округлённых шагов: 1, 2, 5 × 10ⁿ.
Контрол можно добавлять и удалять динамически.
const scale = L.control.scale();
scale.addTo(map);
map.removeControl(scale);
После удаления шкала перестаёт реагировать на события карты и удаляется из DOM.
Хотя Leaflet по умолчанию использует Web Mercator, масштабная линейка остаётся корректной в пределах этой проекции. При кастомных CRS поведение зависит от реализации системы координат:
Контрол применяется в случаях, когда требуется:
Он особенно полезен при интерактивном исследовании геоданных, где числовые значения расстояний должны быть интуитивно понятны без дополнительных инструментов измерения.
Точность шкалы зависит от:
На практике шкала даёт достаточную приближённую оценку, но не предназначена для высокоточных геодезических расчётов.