В MapLibre GL JS масштаб карты (zoom) является одним из ключевых параметров, которые могут использоваться прямо внутри выражений стилей. Он позволяет динамически изменять визуализацию слоёв в зависимости от уровня приближения без пересоздания карты и без внешней логики JavaScript.
В выражениях стиля zoom представлен как специальный источник данных, доступный через выражение:
["zoom"]
Это скалярное значение, отражающее текущий уровень приближения карты. Оно используется в выражениях так же, как свойства фич, позволяя строить адаптивную картографическую визуализацию.
Ключевая особенность: zoom не привязан к конкретному объекту данных, он глобален для всего слоя и пересчитывается при каждом изменении масштаба.
Простейшее использование заключается в прямом сравнении или передаче значения в интерполяционные функции:
{
"line-width": [
"interpolate",
["linear"],
["zoom"],
5, 1,
10, 3,
15, 8
]
}
В этом примере толщина линии изменяется плавно в зависимости от масштаба. При zoom 5 ширина равна 1, при zoom 10 — 3, при zoom 15 — 8.
Такой подход позволяет строить визуально стабильные переходы без резких скачков.
Наиболее распространённый сценарий использования zoom — функция:
interpolateexponentiallinearПример экспоненциальной интерполяции:
{
"circle-radius": [
"interpolate",
["exponential", 1.5],
["zoom"],
0, 1,
8, 4,
16, 20
]
}
Экспоненциальная кривая позволяет усиливать рост размеров на высоких масштабах, что особенно полезно для точечных данных.
Для дискретного изменения стилей используется конструкция
step:
{
"text-size": [
"step",
["zoom"],
10,
10, 14,
14, 18
]
}
Здесь:
Такой подход применяется там, где плавность не требуется, а важны фиксированные уровни отображения.
Хотя zoom не является фильтром в классическом смысле, он часто используется для управления видимостью через свойства layout:
{
"layout": {
"visibility": [
"step",
["zoom"],
"none",
8, "visible"
]
}
}
На низком масштабе слой скрыт, начиная с zoom 8 становится видимым.
Альтернативный подход — управление opacity:
{
"line-opacity": [
"interpolate",
["linear"],
["zoom"],
6, 0,
8, 1
]
}
Это создаёт эффект плавного появления слоя.
Текстовые слои особенно чувствительны к масштабу. Типичная стратегия — комбинировать step и interpolate:
{
"text-size": [
"interpolate",
["linear"],
["zoom"],
5, 10,
10, 14,
15, 22
]
}
Дополнительно масштаб влияет на:
text-letter-spacingtext-opacitytext-halo-widthПример:
{
"text-halo-width": [
"interpolate",
["linear"],
["zoom"],
10, 1,
16, 3
]
}
На больших масштабах увеличивается читаемость за счёт усиления обводки.
Zoom может управлять не только геометрией, но и визуальными атрибутами:
{
"fill-color": [
"interpolate",
["linear"],
["zoom"],
5, "#2c7bb6",
10, "#abd9e9",
15, "#fdae61"
]
}
Такой подход применяется для:
Хотя прямого фильтра zoom в filter нет, можно
использовать логические конструкции:
[
"case",
[">=", ["zoom"], 10],
["==", ["get", "type"], "city"],
["==", ["get", "type"], "country"]
]
Здесь логика меняется в зависимости от масштаба: при большом zoom показываются города, при малом — страны.
При работе с большими наборами данных zoom используется для контроля плотности отображения:
{
"circle-opacity": [
"step",
["zoom"],
0,
6, 0.3,
10, 0.8
],
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
6, 2,
12, 6
]
}
Это позволяет:
Для сложных слоёв (дороги, здания, контуры) zoom используется для поэтапного раскрытия геометрии:
{
"line-opacity": [
"step",
["zoom"],
0,
8, 0.5,
12, 1
]
}
Применяется стратегия уровней детализации:
Использование zoom в выражениях напрямую влияет на производительность рендеринга:
interpolate увеличивают нагрузку на GPUОптимизационные подходы:
Наиболее мощные стили получаются при сочетании zoom и данных фич:
{
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
5,
["+", 2, ["get", "weight"]],
12,
["+", 10, ["get", "weight"]]
]
}
Здесь размер зависит одновременно от масштаба и атрибута объекта.
В сложных стилях zoom используется как координата в многомерной функции:
Пример комплексной модели:
{
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
4, 1,
10, 6,
16, 18
],
"circle-opacity": [
"interpolate",
["linear"],
["zoom"],
4, 0.2,
10, 0.8,
16, 1
],
"circle-color": [
"interpolate",
["linear"],
["zoom"],
4, "#74add1",
10, "#4575b4",
16, "#313695"
]
}
Такой подход формирует непрерывную визуальную эволюцию слоя при масштабировании карты.