ScaleControl в Mapbox GL JS представляет собой встроенный элемент управления, предназначенный для отображения линейного масштаба карты. Этот компонент помогает интерпретировать расстояния на экране в реальных единицах измерения и автоматически обновляется при изменении масштаба, центра карты или проекции.
ScaleControl отображает динамическую шкалу, которая визуально показывает, какому расстоянию на местности соответствует определённая длина на экране. При изменении уровня зума масштабная линейка пересчитывается, подстраиваясь под текущую географическую область.
Внутренне контроль опирается на текущую проекцию карты и вычисляет оптимальную длину шкалы таким образом, чтобы она оставалась «читаемой» — обычно это круговые значения вроде 100 м, 500 м, 1 км, 5 км.
Ключевая особенность заключается в том, что контроль не требует ручного обновления: он подписан на события карты и пересчитывает значение автоматически при каждом изменении состояния.
Добавление масштабной линейки выполняется через метод
addControl объекта карты.
import mapboxgl from 'mapbox-gl';
mapboxgl.accessToken = 'YOUR_MAPBOX_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [37.6173, 55.7558],
zoom: 10
});
map.addControl(new mapboxgl.ScaleControl(), 'bottom-left');
В данном примере ScaleControl добавляется в левый нижний угол карты.
Позиция задаётся вторым аргументом метода addControl.
ScaleControl принимает объект настроек, позволяющий управлять внешним видом и единицами измерения.
Основные параметры:
maxWidth Определяет максимальную ширину шкалы в пикселях. По умолчанию используется значение около 100.
unit Задаёт систему единиц измерения:
metric — метры и километрыimperial — футы и милиnautical — морские милиПример конфигурации:
const scale = new mapboxgl.ScaleControl({
maxWidth: 120,
unit: 'metric'
});
map.addControl(scale, 'bottom-right');
При выборе imperial отображение будет автоматически
переключаться на футы и мили, что актуально для интерфейсов,
ориентированных на США и Великобританию.
Масштабная линейка не является статичным элементом. Она реагирует на:
При каждом изменении карты происходит перерасчёт длины шкалы таким образом, чтобы она оставалась максимально удобной для восприятия.
Алгоритм подбирает «красивые» значения длины, избегая дробных и неудобных чисел, используя округления до стандартных географических шагов.
После добавления контроля его можно сохранить в переменную для последующего удаления или динамического изменения.
const scaleControl = new mapboxgl.ScaleControl({
maxWidth: 150,
unit: 'metric'
});
map.addControl(scaleControl);
// удаление при необходимости
map.removeControl(scaleControl);
Такой подход используется в интерфейсах, где элементы управления создаются динамически в зависимости от состояния приложения.
ScaleControl поддерживает стандартные позиции UI-элементов Mapbox GL JS:
top-lefttop-rightbottom-leftbottom-rightВыбор позиции влияет только на размещение блока, но не на его функциональность.
map.addControl(new mapboxgl.ScaleControl(), 'top-left');
ScaleControl рендерится как DOM-элемент с CSS-классом
mapboxgl-ctrl-scale. Это позволяет адаптировать его внешний
вид под дизайн приложения.
Пример кастомизации:
.mapboxgl-ctrl-scale {
background-color: rgba(0, 0, 0, 0.6);
color: #fff;
border-color: #fff;
font-size: 11px;
}
Стили можно использовать для интеграции шкалы в тёмные интерфейсы, минималистичные карты или брендированные приложения.
Выбор единиц влияет не только на отображаемые подписи, но и на внутреннюю логику пересчёта:
Переключение единиц может происходить динамически:
scaleControl.setUnit('imperial');
Это позволяет адаптировать интерфейс под регион пользователя без пересоздания карты.
ScaleControl учитывает devicePixelRatio, что особенно важно на Retina-дисплеях и мобильных устройствах. Расчёты выполняются в географических координатах, после чего результат проецируется в экранные пиксели.
Это обеспечивает корректное отображение масштаба независимо от плотности экрана.
Несмотря на простоту, ScaleControl имеет ряд особенностей:
В большинстве прикладных сценариев эти ограничения не влияют на точность восприятия расстояний, но в навигационных системах высокой точности требуется дополнительная валидация.
ScaleControl часто используется в сочетании с другими элементами управления:
Совместное использование позволяет формировать полноценный картографический интерфейс, где ScaleControl выполняет функцию ориентира расстояний.
map.addControl(new mapboxgl.NavigationControl(), 'top-right');
map.addControl(new mapboxgl.ScaleControl({
maxWidth: 100,
unit: 'metric'
}), 'bottom-left');
В таком составе масштабная линейка становится частью стандартного набора инструментов взаимодействия с картой в Mapbox экосистеме.