Библиотека OpenLayers предназначена для создания интерактивных
веб-карт с поддержкой векторных и растровых слоёв, проекций,
взаимодействий и UI-контролов. Одним из базовых элементов
пользовательского интерфейса карты является компонент масштабной линейки
ScaleLine, реализованный в виде ol.control.ScaleLine.
Масштабная линейка служит для визуального отображения соответствия между расстоянием на экране и реальной дистанцией на местности. В отличие от численного масштаба (например, 1:50000), ScaleLine даёт наглядное представление в метрах или километрах, обновляясь при изменении масштаба карты.
Основные задачи компонента:
Контрол добавляется в карту через массив controls или
методом map.addControl.
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import TileLayer from 'ol/layer/Tile.js';
import OSM from 'ol/source/OSM.js';
import ScaleLine from 'ol/control/ScaleLine.js';
const scaleLineControl = new ScaleLine();
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: [0, 0],
zoom: 2
}),
controls: [scaleLineControl]
});
Контрол автоматически вычисляет масштаб на основе текущего разрешения view.
ScaleLine поддерживает несколько режимов отображения:
metric — метры и километры;imperial — футы и мили;nautical — морские мили;degrees — угловые единицы (реже используется);us — комбинированная система США;scaleline — автоматический выбор подходящего
формата.import ScaleLine from 'ol/control/ScaleLine.js';
const scaleLineControl = new ScaleLine({
units: 'metric'
});
При изменении масштаба карты единицы автоматически пересчитываются для сохранения читаемости.
ScaleLine опирается на разрешение карты
(view.getResolution()), которое определяет количество
метров на пиксель. Базовая логика:
Упрощённо вычисление выглядит так:
distance = resolution × pixelWidth
где pixelWidth — ширина линии в пикселях.
ScaleLine может отображаться в двух основных стилях:
Классическое отображение в виде одной полосы с подписью.
new ScaleLine({
units: 'metric',
bar: false
});
Разделённая шкала с несколькими сегментами, более наглядная при больших масштабах.
new ScaleLine({
units: 'metric',
bar: true
});
Баровый режим полезен для аналитических карт, где важна визуальная сегментация расстояний.
ScaleLine подписывается на события изменения view:
change:resolutionchange:centerПри каждом изменении пересчитывается длина линии и её подпись. Это обеспечивает синхронность между картой и UI без ручного обновления.
В OpenLayers масштабная линейка учитывает особенности проекции:
Особенность: ScaleLine всегда стремится привести результат к метрам, даже если исходная проекция оперирует градусами.
Контрол позволяет регулировать диапазон допустимых размеров линейки:
new ScaleLine({
minWidth: 100,
maxWidth: 200
});
Это влияет на алгоритм выбора «красивого» значения длины.
Подписи автоматически формируются на основе выбранных единиц:
При необходимости можно кастомизировать отображение через CSS:
.ol-scale-line {
background: rgba(0, 0, 0, 0.6);
color: white;
padding: 4px;
border-radius: 2px;
}
ScaleLine является DOM-контролом и может быть размещён в стандартных позициях:
import {defaults as defaultControls} from 'ol/control';
const map = new Map({
controls: defaultControls().extend([
new ScaleLine({
units: 'metric'
})
])
});
Контрол по умолчанию размещается в нижнем левом углу карты.
ScaleLine учитывает devicePixelRatio, что критично для:
Алгоритм пересчёта гарантирует, что физическая длина линии остаётся корректной независимо от устройства.
DOM-структура ScaleLine включает:
.ol-scale-line;.ol-scale-line-inner;Пример расширенной кастомизации:
.ol-scale-line {
bottom: 10px;
left: 10px;
font-family: Arial;
font-size: 12px;
}
.ol-scale-line-inner {
border: 2px solid #2b8cff;
border-top: none;
}
Контрол можно обновлять и заменять динамически:
map.removeControl(scaleLineControl);
const newScaleLine = new ScaleLine({
units: 'imperial'
});
map.addControl(newScaleLine);
Также возможно изменение параметров через пересоздание, так как прямой мутации конфигурации не предусмотрено.
ScaleLine часто применяется в:
Причина — визуальная интерпретация расстояний без необходимости вычислений.
ScaleLine относится к лёгким UI-компонентам:
Это делает его практически бесплатным по производительности даже при частых зумах.
Несмотря на точность, ScaleLine имеет ограничения:
В таких случаях линейка служит ориентиром, а не метрологическим инструментом.
ScaleLine часто комбинируется с:
Так формируется полноценная навигационная панель карты.
При плавном изменении zoom или center ScaleLine обновляется синхронно с анимацией view. Обновление происходит на каждом кадре, но оптимизируется внутренним throttling-механизмом, чтобы избежать избыточных перерасчётов.
Расширение поведения возможно через наследование:
class CustomScaleLine extends ScaleLine {
constructor(options) {
super(options);
}
render() {
super.render();
// дополнительная логика
}
}
Такая модель используется для добавления нестандартных подписей или логирования масштабов.
ScaleLine напрямую зависит от:
resolution — ключевой параметр масштаба;projection — система координат;dpi устройства.Любое изменение resolution автоматически инициирует перерасчёт длины шкалы, что делает компонент полностью реактивным относительно состояния карты.