ScaleControl представляет собой стандартный элемент управления картой, отображающий линейный масштаб текущего масштаба отображения. Его задача — обеспечить визуальное соответствие между расстоянием на экране и реальными географическими расстояниями. В MapLibre GL JS масштабная линейка автоматически пересчитывается при изменении зума и положения карты, поддерживая актуальность отображаемой информации.
Компонент является частью системы встроенных контролов MapLibre GL JS и реализует интерфейс управления картой через единый механизм добавления и удаления элементов управления.
ScaleControl создаётся как экземпляр класса ScaleControl
и добавляется на карту через метод addControl.
import maplibregl from 'maplibre-gl';
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [37.6173, 55.7558],
zoom: 10
});
const scale = new maplibregl.ScaleControl({
maxWidth: 120,
unit: 'metric'
});
map.addControl(scale, 'bottom-left');
Контрол может быть размещён в одной из стандартных позиций
интерфейса: top-left, top-right,
bottom-left, bottom-right.
ScaleControl поддерживает набор опций, определяющих поведение и визуальные характеристики.
Определяет максимальную ширину шкалы в пикселях.
number100Чем больше значение, тем более детализированная шкала отображается на экране.
Определяет систему единиц измерения.
Поддерживаемые значения:
metric — метры и километрыimperial — футы и милиnautical — морские милиconst scale = new maplibregl.ScaleControl({
unit: 'imperial'
});
Выбор единиц влияет на автоматический пересчёт расстояний при отрисовке шкалы.
ScaleControl вычисляет расстояние на основе текущей проекции карты и масштаба зума. Используется геодезическая модель для корректного отображения расстояний на сфере Земли.
Основные этапы вычисления:
ScaleControl автоматически подписывается на события карты:
movezoomrotate (косвенно влияет через пересчёт проекции)При каждом изменении состояния карты пересчитывается длина шкалы. Это обеспечивает непрерывную синхронизацию визуального масштаба с географической реальностью.
При низком зуме (вид глобуса или континентов) шкала отображает крупные единицы (например, сотни километров). При высоком зуме (уровень улиц) шкала автоматически переключается на метры или футы.
Пример типичной адаптации:
Алгоритм подбора значений стремится сохранить читаемость и избегает дробных чисел.
ScaleControl рендерится как HTML-элемент внутри контейнера карты. Структура обычно включает:
Базовые классы:
.maplibregl-ctrl-scale.maplibregl-ctrlПример кастомизации внешнего вида:
.maplibregl-ctrl-scale {
background-color: rgba(0, 0, 0, 0.5);
border-radius: 4px;
padding: 2px 6px;
color: white;
font-size: 12px;
}
Изменение внешнего вида не влияет на вычисления, так как логика полностью отделена от представления.
Хотя ScaleControl в основном автономен, его можно удалять и повторно добавлять в зависимости от состояния приложения.
map.removeControl(scale);
map.addControl(scale, 'top-right');
Некоторые реализации позволяют менять единицы измерения динамически через доступ к экземпляру:
scale.setUnit('imperial');
ScaleControl часто используется в интерфейсах, где требуется динамическая адаптация под размер экрана:
При уменьшении доступного пространства шкала может быть перенесена в менее приоритетную область интерфейса или скрыта.
MapLibre GL JS использует WebGL для рендеринга карты, однако ScaleControl работает полностью через DOM. Это создаёт разделение:
Преимущество подхода заключается в снижении нагрузки на WebGL-пайплайн и упрощении кастомизации UI.
Расчёт расстояний в ScaleControl основан на сферической модели Земли. Это означает:
На высоких широтах возможны визуальные отклонения, связанные с проекцией Web Mercator.
В редких сценариях допускается добавление нескольких ScaleControl с разными единицами измерения:
map.addControl(new maplibregl.ScaleControl({ unit: 'metric' }), 'bottom-left');
map.addControl(new maplibregl.ScaleControl({ unit: 'imperial' }), 'bottom-left');
Это используется в мульти-региональных системах, где требуется одновременное отображение разных систем измерения.
При смене стиля (setStyle) ScaleControl сохраняет своё
состояние, так как не зависит от источников данных стиля. Однако после
полной перезагрузки стиля карта пересчитывает параметры зума и центра,
что приводит к обновлению шкалы.
ScaleControl может служить базой для кастомных контролов, реализующих дополнительную логику:
Типовая схема расширения:
class ExtendedScaleControl extends maplibregl.ScaleControl {
onAdd(map) {
const container = super.onAdd(map);
// дополнительная логика
return container;
}
}
ScaleControl практически не влияет на производительность, поскольку:
Даже при частых событиях движения карты нагрузка остаётся минимальной.
ScaleControl часто используется совместно с:
В таких конфигурациях масштабная линейка служит ориентиром для всех остальных элементов интерфейса.