- Математические выражения
- Логические выражения для булевых значений и переключателей
- Строчные выражения
- Выражения с данными - использование свойств фич представленных в исходных (source) данных.
- Выражения камеры - предоставляют доступ к параметрам отвечающим за текущий вид карты
Все выражения представлены как JSON массивы.
Первый элемент каждого выражения это строчное название оператора выражения.
Второй и последующие - аргументы выражения. В качестве аргументов могут выступать string
, number
, boolean
, null
или другие выражения
Например:
[expression_name, argument_0, argument_1]
В JavaScript это выглядело бы так
expression_name(argument_0, argument_2)
Выражениями с данными называются все выражения которые получают доступ к данным фичи (feature).
Т.е. это все выражения котороые используют операторы данных - get
, has
, id
, geometry-type
, properties
или feature-state
.
Они позволяют использваоть свойста фич для определения их внешнего вида.
Часто их используют для различения фич расположеных в одном слое в задачах про визуализацию данных.
Пример: плавное изменение цвета в зависимости от температуры:
{
"circle-color": [
"rgb",
// red is higher when feature.properties.temperature is higher
["get", "temperature"],
// green is always zero
0,
// blue is higher when feature.properties.temperature is lower
["-", 100, ["get", "temperature"]]
]
}
JavaScript эквивалент:
circle-color: rgb(get('temperature'), 0, -(100, get('temperature')))
Так для температуры 20 грудусов цвет круга будет 20, 0, 80
в rgb формате,
Выражения камеры это любые выражения которые используют оператор zoom
.
Каждое выражение позволяет управлять изменением отображения слоя в зависимости от текущего зума карты. Используются для управления внешним видом и управлением плотностью данных в зависимости от текущего зума карты.
{
"circle-radius": [
"interpolate", ["linear"], ["zoom"],
// zoom is 5 (or less) -> circle radius will be 1px
5, 1,
// zoom is 10 (or greater) -> circle radius will be 5px
10, 5
]
}
в JS это выглядело бы так
{
circle-radius: interpolate(linear(), zoom(), 5, 1, 10, 5)
}
interpolate
принимает первым аргументом функцию интерполяции, в данном случае это linear
(линейная).
вторым аргументом относительно какого параметра мы меняем значение радиуса (zoom
), остальные аргументы описывают граничные значения:
зум 5 и ниже -> радиус 1 px
зум 10 и выше -> радиус 5 px
Таким образом а зуме 7,5 радус быдут линейно интерполирован до радиуса в 2px.
Выражения камеры могут быть использованы где угодно, однако при использовании таких значений как значений layout
или paint
они могут быть только одной из следующих форм:
[ "interpolate", interpolation, ["zoom"], ... ]
Или:
[ "step", ["zoom"], ... ]
Или:
[
"let",
// ... variable bindings... ,
[ "interpolate", interpolation, ["zoom"], ... ]
]
Или:
[
"let",
// ... variable bindings... ,
[ "step", ["zoom"], ... ]
]
Т.е. для layout
и paint
свойство ["zoom"]
может быть только как аругмент для interpolate
или step
выражения, или это может быть любое выражение обьявленое через let
выражение.
Еще одно важное отличие между layout
и paint
свойствами в времени выполнения выражения.
paint
свойство выражения камеры пересчитывается каждый раз когда изменяется зум, даже незанчительно. Например paint
свойство будет пересчитано после движения камеры от зума 4.1 к зуму 4.6.
В тоже время layout
свойство будет пересчитано только после изменения зума на следующее целочисленое значение зума. Т.е. зума должен поменяться как минимум с 4.1 до 5 или с 4.1 до 3.9 чтобы значение было пересчитано.