Выражения стиля на основе данных (пакет SDK для Android)
Примечание.
Прекращение использования пакета SDK для Android для Azure Maps
Пакет SDK для машинного кода Azure Maps для Android теперь не рекомендуется и будет снят с 3.31.25. Чтобы избежать сбоев в работе служб, перейдите в веб-пакет SDK Azure Maps на 3/31/25. Дополнительные сведения см . в руководстве по миграции пакета SDK для Android для Azure Maps.
Выражения позволяют применять бизнес-логику к параметрам стилей, которые используют свойства, определенные в каждой фигуре источника данных. Выражения позволяют фильтровать данные в источнике или слое. Выражения могут включать условную логику, например операторы if. Кроме того, их можно использовать для манипуляций с данными с помощью строковых, логических и математических операторов.
Стили на основе данных сокращают объем кода, необходимого для реализации бизнес-логики стилей. При использовании в сочетании со слоями выражения вычисляются во время отрисовки в отдельном потоке. Это повышает производительность по сравнению с выполнением бизнес-логики в потоке пользовательского интерфейса.
Пакет SDK для Android в Azure Maps поддерживает почти все те же выражения стиля, что и веб-пакет SDK в Azure Maps, поэтому все концепции, которые описаны в статье Выражения стиля на основе данных (веб-пакет SDK), можно переносить в приложение Android. Все выражения стиля в пакете SDK для Android в Azure Maps доступны в пространстве имен com.microsoft.azure.maps.mapcontrol.options.Expression
. Существует множество различных типов выражений стиля.
Тип выражений | Description |
---|---|
Логические выражения | Логические выражения — это выражения с логическими операторами для выполнения логических сравнений. |
Выражения цвета | Выражения цвета упрощают создание цветовых значений и манипуляции с ними. |
Условные выражения | Условные выражения содержат логические операции, действующие как операторы if. |
Выражения данных | Служат для доступа к значениям свойств в компоненте. |
Выражения интерполяции и пошаговые выражения | Выражения интерполяции и пошаговые выражения можно использовать для вычисления значений на интерполированной кривой или ступенчатой функции. |
Выражения на основе JSON | Упрощает повторное использование выражений на основе JSON необработанных стилей, созданных для веб-пакета SDK, с помощью пакета SDK для Android. |
Выражения для конкретных слоев | Специальные выражения, применимые только к определенному слою. |
Математические выражения | Используют математические операторы для вычислений на основе данных на платформе выражений. |
Выражения строковых операторов | Выражения строковых операторов выполняют операции преобразования строк, таких как объединение и преобразование регистра. |
Выражения типов | Выражения типа используются для проверки и преобразования различных типов данных, таких как строки, числа и логические значения. |
Выражения привязки переменных | Выражения привязки переменных сохраняют результаты вычисления в переменной, на которую можно ссылаться в других частях выражения без необходимости повторного вычисления сохраненного значения. |
Выражение масштаба | Возвращает текущий уровень масштаба карты во время отрисовки. |
Примечание.
Синтаксис выражений является практически идентичным в Java и Kotlin. Если в документации для Kotlin отображаются блоки кода для Java, это означает, что код одинаков на обоих языках.
Во всех примерах в этом разделе документа для демонстрации различных способов использования выражений используется следующий компонент.
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-122.13284, 47.63699]
},
"properties": {
"id": 123,
"entityType": "restaurant",
"revenue": 12345,
"subTitle": "Building 40",
"temperature": 64,
"title": "Cafeteria",
"zoneColor": "purple",
"abcArray": ["a", "b", "c"],
"array2d": [["a", "b"], ["x", "y"]],
"_style": {
"fillColor": "red"
}
}
}
В следующем коде показано, как вручную создать эту функцию GeoJSON в приложении.
//Create a point feature.
Feature feature = Feature.fromGeometry(Point.fromLngLat(-100, 45));
//Add properties to the feature.
feature.addNumberProperty("id", 123);
feature.addStringProperty("entityType", "restaurant");
feature.addNumberProperty("revenue", 12345);
feature.addStringProperty("subTitle", "Building 40");
feature.addNumberProperty("temperature", 64);
feature.addStringProperty("title", "Cafeteria");
feature.addStringProperty("zoneColor", "purple");
JsonArray abcArray = new JsonArray();
abcArray.add("a");
abcArray.add("b");
abcArray.add("c");
feature.addProperty("abcArray", abcArray);
JsonArray array1 = new JsonArray();
array1.add("a");
array1.add("b");
JsonArray array2 = new JsonArray();
array1.add("x");
array1.add("y");
JsonArray array2d = new JsonArray();
array2d.add(array1);
array2d.add(array2);
feature.addProperty("array2d", array2d);
JsonObject style = new JsonObject();
style.addProperty("fillColor", "red");
feature.addProperty("_style", style);
//Create a point feature.
val feature = Feature.fromGeometry(Point.fromLngLat(-100, 45))
//Add properties to the feature.
feature.addNumberProperty("id", 123)
feature.addStringProperty("entityType", "restaurant")
feature.addNumberProperty("revenue", 12345)
feature.addStringProperty("subTitle", "Building 40")
feature.addNumberProperty("temperature", 64)
feature.addStringProperty("title", "Cafeteria")
feature.addStringProperty("zoneColor", "purple")
val abcArray = JsonArray()
abcArray.add("a")
abcArray.add("b")
abcArray.add("c")
feature.addProperty("abcArray", abcArray)
val array1 = JsonArray()
array1.add("a")
array1.add("b")
val array2 = JsonArray()
array1.add("x")
array1.add("y")
val array2d = JsonArray()
array2d.add(array1)
array2d.add(array2)
feature.addProperty("array2d", array2d)
val style = JsonObject()
style.addProperty("fillColor", "red")
feature.addProperty("_style", style)
В следующем коде показано, как выполнить десериализацию переведенной версии объекта JSON в функцию GeoJSON в приложении.
String featureString = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-122.13284,47.63699]},\"properties\":{\"id\":123,\"entityType\":\"restaurant\",\"revenue\":12345,\"subTitle\":\"Building 40\",\"temperature\":64,\"title\":\"Cafeteria\",\"zoneColor\":\"purple\",\"abcArray\":[\"a\",\"b\",\"c\"],\"array2d\":[[\"a\",\"b\"],[\"x\",\"y\"]],\"_style\":{\"fillColor\":\"red\"}}}";
Feature feature = Feature.fromJson(featureString);
val featureString = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-122.13284,47.63699]},\"properties\":{\"id\":123,\"entityType\":\"restaurant\",\"revenue\":12345,\"subTitle\":\"Building 40\",\"temperature\":64,\"title\":\"Cafeteria\",\"zoneColor\":\"purple\",\"abcArray\":[\"a\",\"b\",\"c\"],\"array2d\":[[\"a\",\"b\"],[\"x\",\"y\"]],\"_style\":{\"fillColor\":\"red\"}}}"
val feature = Feature.fromJson(featureString)
Выражения на основе JSON
Веб-пакет SDK в Azure Maps также поддерживает выражения стиля на основе данных, представленные с помощью массива JSON. Эти же выражения можно создать повторно с помощью собственного класса Expression
в пакете SDK для Android. Кроме того, эти выражения на основе JSON можно преобразовать в строку с помощью веб-функции, такой как JSON.stringify
, и передать в метод Expression.raw(String rawExpression)
. Например, просмотрите приведенное ниже выражение JSON.
var exp = ['get','title'];
JSON.stringify(exp); // = "['get','title']"
Переведенная версия приведенного выше выражения будет иметь значение "['get','title']"
и может быть считана в пакет SDK для Android, как показано ниже.
Expression exp = Expression.raw("['get','title']")
val exp = Expression.raw("['get','title']")
Такой подход позволяет легко использовать выражения стиля в мобильных приложениях и веб-приложениях, использующих Azure Maps.
В этом видео представлен обзор стилей на основе данных в Azure Maps.
Выражения данных
Выражения данных служат для доступа к значениям свойств в компоненте.
Expression | Возвращаемый тип | Description |
---|---|---|
accumulated() |
number | Получает значение свойства кластера, накопленного к настоящему моменту. Его можно использовать только в параметре clusterProperties кластеризованного источника DataSource . |
at(number | Expression, Expression) |
значение | Извлекает элемент из массива. |
geometryType() |
строка | Возвращает геометрический тип компонента: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon. |
get(string | Expression) | get(string | Expression, Expression) |
значение | Возвращает значение свойства из свойств указанного объекта. Если запрошенное свойство отсутствует, возвращает значение null. |
has(string | Expression) | has(string | Expression, Expression) |
boolean | Определяет, содержат ли свойства компонента указанное свойство. |
id() |
значение | Возвращает идентификатор компонента, если он имеется. |
in(string | number | Expression, Expression) |
boolean | Определяет, существует ли элемент в массиве. |
length(string | Expression) |
number | Возвращает длину строки или массива. |
properties() |
значение | Получает объект свойства функции. |
Следующие выражения стиля веб-пакета SDK не поддерживаются в пакете SDK для Android:
- index-of
- slice
Примеры
К свойствам компонента можно обратиться непосредственно в выражении с помощью выражения get
. В этом примере значение zoneColor
компонента задает свойства цвета слоя выноски.
BubbleLayer layer = new BubbleLayer(source,
//Get the zoneColor value.
bubbleColor(get("zoneColor"))
);
val layer = BubbleLayer(source,
//Get the zoneColor value.
bubbleColor(get("zoneColor"))
)
Приведенный выше пример работает хорошо, если все функции точки имеют zoneColor
свойство. В противном случае, скорее всего, по умолчанию будет возвращен черный цвет. Если цвет по умолчанию вас не устраивает, используйте выражение switchCase
в сочетании с выражением has
, чтобы проверить, существует ли соответствующее свойство. Если свойство не существует, возвращается цвет по умолчанию.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
//Use a conditional case expression.
switchCase(
//Check to see if feature has a "zoneColor"
has("zoneColor"),
//If it does, use it.
get("zoneColor"),
//If it doesn't, default to blue.
literal("blue")
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
//Use a conditional case expression.
switchCase(
//Check to see if feature has a "zoneColor"
has("zoneColor"),
//If it does, use it.
get("zoneColor"),
//If it doesn't, default to blue.
literal("blue")
)
)
)
Слои пузырьков и символов отображают координаты всех фигур в источнике данных по умолчанию. Это позволяет выделить вершины многоугольника или изломы линии. Параметр filter
слоя позволяет ограничить геометрический тип отображаемого компонента с помощью выражения geometryType
в составе логического выражения. В следующем примере для слоя выноски установлено ограничение, согласно которому отображаются только компоненты Point
.
BubbleLayer layer = new BubbleLayer(source,
filter(eq(geometryType(), "Point"))
);
val layer = BubbleLayer(source,
filter(eq(geometryType(), "Point"))
)
В следующем примере разрешена отрисовка компонентов Point
и MultiPoint
.
BubbleLayer layer = new BubbleLayer(source,
filter(any(eq(geometryType(), "Point"), eq(geometryType(), "MultiPoint")))
);
val layer = BubbleLayer(source,
filter(any(eq(geometryType(), "Point"), eq(geometryType(), "MultiPoint")))
)
Аналогичным образом структура многоугольников отрисовывается на слоях линий. Чтобы отключить эту функцию для слоя линий, добавьте фильтр, разрешающий только компоненты LineString
и MultiLineString
.
Ниже приведены дополнительные примеры использования выражений данных:
//Get item [2] from an array "properties.abcArray[1]" = "c"
at(2, get("abcArray"))
//Get item [0][1] from a 2D array "properties.array2d[0][1]" = "b"
at(1, at(0, get("array2d")))
//Check to see if a value is in an array "properties.abcArray.indexOf('a') !== -1" = true
in("a", get("abcArray"))
//Get the length of an array "properties.abcArray.length" = 3
length(get("abcArray"))
//Get the value of a subproperty "properties._style.fillColor" = "red"
get("fillColor", get("_style"))
//Check that "fillColor" exists as a subproperty of "_style".
has("fillColor", get("_style"))
Математические выражения
Математические выражения используют математические операторы для вычислений на основе данных на платформе выражений.
Expression | Возвращаемый тип | Description |
---|---|---|
abs(number | Expression) |
number | Вычисляет абсолютное значение указанного числа. |
acos(number | Expression) |
number | Вычисляет арккосинус заданного числа. |
asin(number | Expression) |
number | Вычисляет арксинус заданного числа. |
atan(number | Expression) |
number | Вычисляет арктангенс заданного числа. |
ceil(number | Expression) |
number | Округляет число до целого вверх. |
cos(number | Expression) |
number | Вычисляет косинус заданного числа. |
division(number, number) | division(Expression, Expression) |
number | Делит первое число на второе. Выражение эквивалента веб-пакета SDK: / |
e() |
number | Возвращает математическую константу e . |
floor(number | Expression) |
number | Округляет число до целого вниз. |
log10(number | Expression) |
number | Вычисляет десятичный логарифм заданного числа. |
log2(number | Expression) |
number | Вычисляет двоичный логарифм заданного числа. |
ln(number | Expression) |
number | Вычисляет натуральный логарифм заданного числа. |
ln2() |
number | Возвращает математическую константу ln(2) . |
max(numbers... | expressions...) |
number | Вычисляет максимальное число в заданном наборе чисел. |
min(numbers... | expressions...) |
number | Вычисляет минимальное число в заданном наборе чисел. |
mod(number, number) | mod(Expression, Expression) |
number | Рассчитывает остаток результата деления первого числа на второе. Выражение эквивалента веб-пакета SDK: % |
pi() |
number | Возвращает математическую константу PI . |
pow(number, number) | pow(Expression, Expression) |
number | Вычисляет значение первого числа, возведенного в степень второго числа. |
product(numbers... | expressions...) |
number | Умножает заданные числа. Выражение эквивалента веб-пакета SDK: * |
round(number | Expression) |
number | Округляет значение до ближайшего целого. Половинные значения округляются вверх (от нуля). Например, round(-1.5) принимает значение -2 . |
sin(number | Expression) |
number | Вычисляет синус заданного числа. |
sqrt(number | Expression) |
number | Вычисляет квадратный корень указанного числа. |
subtract(number | Expression |
number | Вычитает 0 из заданного числа. |
subtract(number | Expression, number | Expression) |
number | Вычитает второе число из первого. |
sum(numbers... | expressions...) |
number | Вычисляет сумму заданных чисел. |
tan(number | Expression) |
number | Вычисляет тангенс заданного числа. |
Логические выражения
Логические выражения — это выражения с логическими операторами для выполнения логических сравнений.
Сравнение значений строго типизировано. Значения разных типов всегда считаются неравными. Случаи, когда типы, как известно, отличаются во время синтаксического анализа, считаются недопустимыми и создают ошибку синтаксического анализа.
Expression | Возвращаемый тип | Description |
---|---|---|
all(Expression...) |
boolean | Возвращает true , если все входные значения равны true , либо false в противном случае. |
any(Expression...) |
boolean | Возвращает true , если любое входное значение равно true , либо false в противном случае. |
eq(Expression compareOne, Expression | boolean | number | string compareTwo) | eq(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает true , если входные значения равны, либо false в противном случае. Оба аргумента должны быть либо строками, либо числами. |
gt(Expression compareOne, Expression | boolean | number | string compareTwo) | gt(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает true , если первое входное значение строго больше второго, либо false в противном случае. Оба аргумента должны быть либо строками, либо числами. |
gte(Expression compareOne, Expression | boolean | number | string compareTwo) | gte(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает true , если первое входное значение больше второго или равно ему, либо false в противном случае. Оба аргумента должны быть либо строками, либо числами. |
lt(Expression compareOne, Expression | boolean | number | string compareTwo) | lt(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает true , если первое входное значение строго меньше второго, либо false в противном случае. Оба аргумента должны быть либо строками, либо числами. |
lte(Expression compareOne, Expression | boolean | number | string compareTwo) | lte(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает true , если первое входное значение меньше второго или равно ему, либо false в противном случае. Оба аргумента должны быть либо строками, либо числами. |
neq(Expression compareOne, Expression | boolean | number | string compareTwo) | neq(Expression compareOne, Expression | string compareTwo, Expression collator) |
boolean | Возвращает значение true , если входные значения не равны, false в противном случае. |
not(Expression | boolean) |
boolean | Логическое отрицание. Возвращает true для входного значения false и false для входного значения true . |
Условные выражения
Условные выражения содержат логические операции, действующие как операторы if.
Следующие выражения выполняют условные логические операции с входными данными. Например, выражение switchCase
реализует логику "if/then/else", а выражение match
— оператор switch.
Выражение переключения регистра
Выражение switchCase
— это разновидность условного выражения, которое реализует логику "if/then/else". Такое выражение проверяет набор логических условий. Оно возвращает выходное значение первого логического условия, для которого вычисление дает true.
В псевдокоде ниже представлена принципиальная структура выражения switchCase
.
switchCase(
condition1: boolean expression,
output1: value,
condition2: boolean expression,
output2: value,
...,
fallback: value
)
Пример
В следующем примере различные логические условия проверяются до тех пор, пока не будет найдено выражение, результатом вычисления которого является true
, и возвращается соответствующее значение. Если логическое условие не оценивается true
, возвращается резервное значение.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
switchCase(
//Check to see if the first boolean expression is true, and if it is, return its assigned result.
//If it has a zoneColor property, use its value as a color.
has("zoneColor"), toColor(get("zoneColor")),
//Check to see if the second boolean expression is true, and if it is, return its assigned result.
//If it has a temperature property with a value greater than or equal to 100, make it red.
all(has("temperature"), gte(get("temperature"), 100)), color(Color.RED),
//Specify a default value to return. In this case green.
color(Color.GREEN)
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
switchCase(
//Check to see if the first boolean expression is true, and if it is, return its assigned result.
//If it has a zoneColor property, use its value as a color.
has("zoneColor"), toColor(get("zoneColor")),
//Check to see if the second boolean expression is true, and if it is, return its assigned result.
//If it has a temperature property with a value greater than or equal to 100, make it red.
all(has("temperature"), gte(get("temperature"), 100)), color(Color.RED),
//Specify a default value to return. In this case green.
color(Color.GREEN)
)
)
)
Выражение match
Выражение match
— это разновидность условного выражения, которое реализует логику оператора switch. Входными данными может быть любое выражение, например get( "entityType")
, возвращающее строку или число. Каждый шаг должен иметь метку, которая является либо отдельным литеральным значением, либо массивом литеральных значений, все значения которых должны быть строками или числами. Для совпадения по входному значению должно быть совпадение по любому значению в соответствующем массиве. Каждая метка шага должна быть уникальной. Если входной тип не соответствует типу меток, результатом является резервное значение по умолчанию.
В псевдокоде ниже представлена принципиальная структура выражения match
.
match(Expression input, Expression defaultOutput, Expression.Stop... stops)
Примеры
В следующем примере анализируется свойство entityType
компонента Point в поиске совпадения в слое выносок. Если совпадение обнаруживается, возвращается указанное значение; в противном случае возвращается базовое значение.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
match(
//Get the input value to match.
get("entityType"),
//Specify a default value to return if no match is found.
color(Color.BLACK),
//List the values to match and the result to return for each match.
//If value is "restaurant" return "red".
stop("restaurant", color(Color.RED)),
//If value is "park" return "green".
stop("park", color(Color.GREEN))
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
match(
//Get the input value to match.
get("entityType"),
//Specify a default value to return if no match is found.
color(Color.BLACK),
//List the values to match and the result to return for each match.
//If value is "restaurant" return "red".
stop("restaurant", color(Color.RED)),
//If value is "park" return "green".
stop("park", color(Color.GREEN))
)
)
)
В следующем примере используется массив меток, все из которых должны возвращать одно и то же значение. Этот подход гораздо эффективнее, чем указание каждой метки по отдельности. В этом случае, если entityType
свойство имеет значение "ресторан" или "grocery_store", возвращается цвет "красный".
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
match(
//Get the input value to match.
get("entityType"),
//Specify a default value to return if no match is found.
color(Color.BLACK),
//List the values to match and the result to return for each match.
//If value is "restaurant" or "grocery_store" return "red".
stop(Arrays.asList("restaurant", "grocery_store"), color(Color.RED)),
//If value is "park" return "green".
stop("park", color(Color.GREEN))
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
match(
//Get the input value to match.
get("entityType"),
//Specify a default value to return if no match is found.
color(Color.BLACK),
//List the values to match and the result to return for each match.
//If value is "restaurant" or "grocery_store" return "red".
stop(arrayOf("restaurant", "grocery_store"), color(Color.RED)),
//If value is "park" return "green".
stop("park", color(Color.GREEN))
)
)
)
Выражение объединения
Выражение coalesce
перебирает набор выражений до тех пор, пока не будет получено первое значение, отличное от null, и возвращает это значение.
В псевдокоде ниже представлена принципиальная структура выражения coalesce
.
coalesce(Expression... input)
Пример
В следующем примере используется выражение coalesce
, которое задает параметр textField
уровня символов. title
Если свойство отсутствует в компоненте или задано значениеnull
, выражение пытается найти subTitle
свойство, если оно отсутствует или null
оно будет возвращаться к пустой строке.
SymbolLayer layer = new SymbolLayer(source,
textField(
coalesce(
//Try getting the title property.
get("title"),
//If there is no title, try getting the subTitle.
get("subTitle"),
//Default to an empty string.
literal("")
)
)
);
val layer = SymbolLayer(source,
textField(
coalesce(
//Try getting the title property.
get("title"),
//If there is no title, try getting the subTitle.
get("subTitle"),
//Default to an empty string.
literal("")
)
)
)
Выражения типа
Выражения типа используются для проверки и преобразования различных типов данных, таких как строки, числа и логические значения.
Expression | Возвращаемый тип | Description |
---|---|---|
array(Expression) |
Object[] | Подтверждает, что входные данные являются массивом. |
bool(Expression) |
boolean | Подтверждает, что входное значение является логическим. |
collator(boolean caseSensitive, boolean diacriticSensitive) | collator(boolean caseSensitive, boolean diacriticSensitive, java.util.Locale locale) | collator(Expression caseSensitive, Expression diacriticSensitive) | collator(Expression caseSensitive, Expression diacriticSensitive, Expression locale) |
collator | Возвращает объект collator для использования в операциях сравнения, зависящих от языкового стандарта. Параметры case-sensitive (с учетом регистра) и diacritic-sensitive (с учетом диакритических знаков) по умолчанию имеют значение false. Аргумент locale задает тег языка IETF используемого языкового стандарта. Если это значение не указано, используется языковой стандарт по умолчанию. Если запрошенный языковой стандарт недоступен, параметры сортировки используют системный резервный языковой стандарт. С помощью параметра resolved-locale можно проверить результаты возврата базового языкового стандарта (варианта по умолчанию). |
literal(boolean \| number \| string \| Object \| Object[]) |
boolean | number | string | Object | Object[] | Возвращает литеральный массив или значение объекта. Это выражение позволяет запретить обработку массива или объекта в качестве выражения. Это необходимо, если выражение должно возвращать массив или объект. |
number(Expression) |
number | Подтверждает, что входное значение является числом. |
object(Expression) |
Object | Подтверждает, что входное значение является объектом. |
string(Expression) |
строка | Подтверждает, что входное значение является строкой. |
toArray(Expression) |
Object[] | Преобразует выражение в массив объектов JSON. |
toBool(Expression) |
boolean | Преобразует входное значение в логическое. |
toNumber(Expression) |
number | По возможности преобразует входное значение в число. |
toString(Expression) |
строка | Преобразует входное значение в строку. |
typeoOf(Expression) |
строка | Возвращает строку, описывающую тип заданного значения. |
Выражения цвета
Выражения цвета упрощают создание цветовых значений и манипуляции с ними.
Expression | Возвращаемый тип | Description |
---|---|---|
color(int) |
color | Преобразует целочисленное значение цвета в выражение цвета. |
rgb(Expression red, Expression green, Expression blue) | rgb(number red, number green, number blue) |
color | Создает значение цвета из красного, зеленого и синего компонентов, которые должны находиться в диапазоне от 0 до 255 , и альфа-компонента 1 . Если какой-либо компонент выходит за пределы диапазона, выражение возвращает ошибку. |
rgba(Expression red, Expression green, Expression blue, Expression alpha) | rgba(number red, number green, number blue, number alpha) |
color | Создает значение цвета из красного, зеленого и синего компонентов, которые должны находиться в диапазоне от 0 до 255 , и альфа-компонента в диапазоне от 0 до 1 . Если какой-либо компонент выходит за пределы диапазона, выражение возвращает ошибку. |
toColor(Expression) |
color | Преобразует входное значение в цвет. |
toRgba(Expression) |
color | Возвращает массив из четырех элементов, содержащий красный, зеленый, синий и альфа-компоненты входного цвета в указанном порядке. |
Пример
В следующем примере создается значение цвета RGB со значением красного, равным 255
, а также значениями зеленого и синего, которые рассчитываются путем умножения на 2.5
значение свойства temperature
. По мере изменения температуры цвет изменяется на различные оттенки красного цвета.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
//Create a RGB color value.
rgb(
//Set red value to 255. Wrap with literal expression since using expressions for other values.
literal(255f),
//Multiple the temperature by 2.5 and set the green value.
product(literal(2.5f), get("temperature")),
//Multiple the temperature by 2.5 and set the blue value.
product(literal(2.5f), get("temperature"))
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
//Create a RGB color value.
rgb(
//Set red value to 255. Wrap with literal expression since using expressions for other values.
literal(255f),
//Multiple the temperature by 2.5 and set the green value.
product(literal(2.5f), get("temperature")),
//Multiple the temperature by 2.5 and set the blue value.
product(literal(2.5f), get("temperature"))
)
)
)
Если все параметры цвета являются числами, их не нужно обтекать выражением literal
. Например:
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
//Create a RGB color value.
rgb(
255f, //Set red value to 255.
150f, //Set green value to 150.
0f //Set blue value to 0.
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
//Create a RGB color value.
rgb(
255f, //Set red value to 255.
150f, //Set green value to 150.
0f //Set blue value to 0.
)
)
)
Совет
Значения цвета строк можно преобразовать в цвет с помощью метода android.graphics.Color.parseColor
. Следующий пример преобразует шестнадцатеричную строку цвета в выражение цвета, которое можно использовать со слоем.
color(parseColor("#ff00ff"))
Выражения строковых операторов
Выражения строковых операторов выполняют операции преобразования строк, таких как объединение и преобразование регистра.
Expression | Возвращаемый тип | Description |
---|---|---|
concat(string...) | concat(Expression...) |
строка | Сцепляет несколько строк в одну. Каждое значение должно быть строкой. При необходимости для преобразования значений других типов в строку используйте выражение типа toString . |
downcase(string) | downcase(Expression) |
строка | Преобразует заданную строку в нижний регистр. |
isSupportedScript(string) | isSupportedScript(Expression) |
boolean | Определяет, используется ли во входной строке кодировка, поддерживаемая текущим стеком шрифтов. Например: isSupportedScript("ಗೌರವಾರ್ಥವಾಗಿ") |
resolvedLocale(Expression collator) |
строка | Возвращает тег языка IETF для языкового стандарта, используемого указанным объектом collator. Это позволяет определить языковой стандарт системы по умолчанию или выяснить, был ли успешно загружен запрошенный языковой стандарт. |
upcase(string) | upcase(Expression) |
строка | Преобразует заданную строку в верхний регистр. |
Пример
В следующем примере свойство temperature
компонента-точки преобразуется в строку, а затем в конец этой строки добавляется "°F".
SymbolLayer layer = new SymbolLayer(source,
textField(
concat(Expression.toString(get("temperature")), literal("°F"))
),
//Some additional style options.
textOffset(new Float[] { 0f, -1.5f }),
textSize(12f),
textColor("white")
);
val layer = SymbolLayer(source,
textField(
concat(Expression.toString(get("temperature")), literal("°F"))
),
//Some additional style options.
textOffset(new Float[] { 0f, -1.5f }),
textSize(12f),
textColor("white")
)
Приведенное выше выражение отображает закрепление на карте с текстом "64°F", наложенным на него, как показано на следующем рисунке.
Выражения интерполяции и пошаговые выражения
Выражения интерполяции и пошаговые выражения можно использовать для вычисления значений на интерполированной кривой или ступенчатой функции. Эти выражения принимают в качестве входных данных выражение, возвращающее числовое значение, например get("temperature")
. Входное значение вычисляется с использованием пар входных и выходных значений, чтобы определить величину, которая лучше соответствует интерполированной кривой или ступенчатой функции. Выходные значения называются шагами. Входные значения для каждого шага должны быть числами, указанными в возрастающем порядке. Выходные значения должны быть числами, массивами чисел или цветами.
Выражение интерполяции
Выражение interpolate
можно использовать для вычисления непрерывного гладкого набора значений путем интерполяции между значениями шагов. Выражение interpolate
, возвращающее цветовые значения, создает цветовой градиент, из которого выбираются результирующие значения. Выражение interpolate
имеет следующие форматы:
//Stops consist of two expressions.
interpolate(Expression.Interpolator interpolation, Expression number, Expression... stops)
//Stop expression wraps two values.
interpolate(Expression.Interpolator interpolation, Expression number, Expression.Stop... stops)
В выражении interpolate
можно использовать три метода интерполяции:
Имя | Описание |
---|---|
linear() |
Выполняет линейную интерполяцию между парой шагов. |
exponential(number) | exponential(Expression) |
Выполняет экспоненциальную интерполяцию между шагами. Указывается значение base, которое определяет коэффициент увеличения выходных значений. Более высокие значения приближают выходные величины к верхнему краю диапазона. Значение base, близкое к 1, делает изменение выходных значений более линейным. |
cubicBezier(number x1, number y1, number x2, number y2) | cubicBezier(Expression x1, Expression y1, Expression x2, Expression y2) |
Выполняет интерполяцию с использованием кривой Безье третьего порядка, определяемой заданными контрольными точками. |
Выражение stop
имеет формат stop(stop, value)
.
Ниже приведен пример того, как выглядят эти различные типы интерполяций.
Линейный | Экспоненциально | Кубическая Bezier |
---|---|---|
Пример
В следующем примере выражение linear interpolate
задает свойство bubbleColor
слоя выносок на основе свойства temperature
компонента-точки. temperature
Если значение меньше 60, возвращается "синий". Если оно составляет от 60 до 70, возвращается желтый цвет. Если оно составляет от 70 до 80, возвращается "оранжевый" (#FFA500
). Если значение равно 80 или больше, возвращается красный цвет.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
interpolate(
linear(),
get("temperature"),
stop(50, color(Color.BLUE)),
stop(60, color(Color.YELLOW)),
stop(70, color(parseColor("#FFA500"))),
stop(80, color(Color.RED))
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
interpolate(
linear(),
get("temperature"),
stop(50, color(Color.BLUE)),
stop(60, color(Color.YELLOW)),
stop(70, color(parseColor("#FFA500"))),
stop(80, color(Color.RED))
)
)
)
На следующем изображении показано, как выбираются цвета для приведенного выше выражения.
Пошаговое выражение
Выражение step
можно использовать для вычисления дискретных ступенчатых результирующих значений с помощью функции piecewise-constant, применяемой к значениям шагов.
Выражение interpolate
имеет следующие форматы:
step(Expression input, Expression defaultOutput, Expression... stops)
step(Expression input, Expression defaultOutput, Expression.Stop... stops)
step(Expression input, number defaultOutput, Expression... stops)
step(Expression input, number defaultOutput, Expression.Stop... stops)
step(number input, Expression defaultOutput, Expression... stops)
step(number input, Expression defaultOutput, Expression.Stop... stops)
step(number input, number defaultOutput, Expression... stops)
step(number input, number defaultOutput, Expression.Stop... stops)
Пошаговые выражения возвращают выходное значение шага, непосредственно предшествующего входному значению, или первое входное значение, если входные данные меньше первого шага.
Пример
В следующем примере выражение step
задает свойство bubbleColor
слоя выносок на основе свойства temperature
компонента-точки. temperature
Если значение меньше 60, возвращается "синий". Если оно составляет от 60 до 70, возвращается "желтый". Если это от 70 до 80, возвращается "оранжевый". Если значение равно 80 или больше, возвращается красный цвет.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
step(
get("temperature"),
color(Color.BLUE),
stop(60, color(Color.YELLOW)),
stop(70, color(parseColor("#FFA500"))),
stop(80, color(Color.RED))
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
step(
get("temperature"),
color(Color.BLUE),
stop(60, color(Color.YELLOW)),
stop(70, color(parseColor("#FFA500"))),
stop(80, color(Color.RED))
)
)
)
На следующем изображении показано, как выбираются цвета для приведенного выше выражения.
Выражения для конкретных слоев
Это особые выражения, которые применяются только к определенным слоям.
Выражение плотности тепловой карты
Выражение плотности тепловой карты извлекает значение плотности тепловой карты для каждого пикселя в слое тепловой карты и определяется в виде heatmapDensity
. Это значение является числом в диапазоне от 0
до 1
. Оно используется в сочетании с выражением interpolation
или step
для определения цветового градиента, применяемого для раскрашивания тепловой карты. Это выражение можно использовать только в параметре heatmapColor
слоя тепловой карты.
Совет
Цвет с индексом 0 в выражении интерполяции или цвет по умолчанию для ступенчатой палитры определяют цвет для всех областей без точек данных. Цвет с индексом 0 можно использовать для определения цвета фона. Многие пользователи предпочитают использовать для этого прозрачный или полупрозрачный черный цвет.
Пример
В этом примере используется выражение линейной интерполяции для создания гладкого цветового градиента для визуализации тепловой карты.
HeatMapLayer layer = new HeatMapLayer(source,
heatmapColor(
interpolate(
linear(),
heatmapDensity(),
stop(0, color(Color.TRANSPARENT)),
stop(0.01, color(Color.MAGENTA)),
stop(0.5, color(parseColor("#fb00fb"))),
stop(1, color(parseColor("#00c3ff")))
)
)
);
val layer = HeatMapLayer(source,
heatmapColor(
interpolate(
linear(),
heatmapDensity(),
stop(0, color(Color.TRANSPARENT)),
stop(0.01, color(Color.MAGENTA)),
stop(0.5, color(parseColor("#fb00fb"))),
stop(1, color(parseColor("#00c3ff")))
)
)
)
Помимо раскрашивания тепловой карты с помощью гладкого градиента, цвета можно задавать в виде набора диапазонов с помощью выражения step
. В выражении step
для раскрашивания тепловой карты плотность данных визуально разбивается на диапазоны. Так карта будет напоминать топографическую или радиолокационную.
HeatMapLayer layer = new HeatMapLayer(source,
heatmapColor(
step(
heatmapDensity(),
color(Color.TRANSPARENT),
stop(0.01, color(parseColor("#000080"))),
stop(0.25, color(parseColor("#000080"))),
stop(0.5, color(Color.GREEN)),
stop(0.5, color(Color.YELLOW)),
stop(1, color(Color.RED))
)
)
);
val layer = HeatMapLayer(source,
heatmapColor(
step(
heatmapDensity(),
color(Color.TRANSPARENT),
stop(0.01, color(parseColor("#000080"))),
stop(0.25, color(parseColor("#000080"))),
stop(0.5, color(Color.GREEN)),
stop(0.5, color(Color.YELLOW)),
stop(1, color(Color.RED))
)
)
)
Дополнительные сведения см. в документации по добавлению слоя тепловой карты.
Выражение линейной позиции
Выражение линейной позиции определяет позицию на линии градиента в слое линий и определяется в виде lineProgress()
. Это значение является числом в диапазоне от 0 до 1. Оно используется в сочетании с выражением interpolation
или step
. Это выражение можно применять только с параметром strokeGradient
слоя линий.
Примечание.
Для параметра strokeGradient
слоя линий параметр lineMetrics
источника данных должен быть установлен в значение true
.
Пример
В этом примере выражение lineProgress()
применяет цветовой градиент к штриху линии.
LineLayer layer = new LineLayer(source,
strokeGradient(
interpolate(
linear(),
lineProgress(),
stop(0, color(Color.BLUE)),
stop(0.1, color(Color.argb(255, 65, 105, 225))), //Royal Blue
stop(0.3, color(Color.CYAN)),
stop(0.5, color(Color.argb(255,0, 255, 0))), //Lime
stop(0.7, color(Color.YELLOW)),
stop(1, color(Color.RED))
)
)
);
val layer = LineLayer(source,
strokeGradient(
interpolate(
linear(),
lineProgress(),
stop(0, color(Color.BLUE)),
stop(0.1, color(Color.argb(255, 65, 105, 225))), //Royal Blue
stop(0.3, color(Color.CYAN)),
stop(0.5, color(Color.argb(255,0, 255, 0))), //Lime
stop(0.7, color(Color.YELLOW)),
stop(1, color(Color.RED))
)
)
)
Выражение формата текстового поля
Выражение format
можно использовать с параметром textField
слоя символов для обеспечения форматирования смешанного текста. Это выражение принимает одно или несколько выражений formatEntry
, задающих строку и набор formatOptions
для добавления к текстовому полю.
Expression | Description |
---|---|
format(Expression...) |
Возвращает форматированный текст, содержащий заметки для использования в записях текстового поля в смешанном формате. |
formatEntry(Expression text) | formatEntry(Expression text, Expression.FormatOption... formatOptions) | formatEntry(String text) | formatEntry(String text, Expression.FormatOption... formatOptions) |
Возвращает форматированную запись строки для использования в выражении format . |
Доступны следующие параметры формата:
Expression | Description |
---|---|
formatFontScale(number) | formatFontScale(Expression) |
Задает коэффициент масштабирования размера шрифта. Если задано, это значение переопределяет textSize свойство для отдельной строки. |
formatTextFont(string[]) | formatTextFont(Expression) |
Задает цвет, применяемый к тексту при визуализации. |
Пример
В следующем примере текстовое поле форматируется путем добавления полужирного шрифта и увеличением шрифта для свойства title
компонента. В этом примере свойство subTitle
компонента также добавляется в новой строке с уменьшенным размером шрифта.
SymbolLayer layer = new SymbolLayer(source,
textField(
format(
//Bold the title property and scale its font size up.
formatEntry(
get("title"),
formatTextFont(new String[] { "StandardFont-Bold" }),
formatFontScale(1.25)),
//Add a new line without any formatting.
formatEntry("\n"),
//Scale the font size down of the subTitle property.
formatEntry(
get("subTitle"),
formatFontScale(0.75))
)
)
);
val layer = SymbolLayer(source,
textField(
format(
//Bold the title property and scale its font size up.
formatEntry(
get("title"),
formatTextFont(arrayOf("StandardFont-Bold")),
formatFontScale(1.25)),
//Add a new line without any formatting.
formatEntry("\n"),
//Scale the font size down of the subTitle property.
formatEntry(
get("subTitle"),
formatFontScale(0.75))
)
)
)
Этот слой отображает функцию точки, как показано на следующем рисунке:
Выражение масштаба
Выражение zoom
используется для получения текущего масштаба отображения во время визуализации и определяется в виде zoom()
. Это выражение возвращает число в диапазоне между минимальным и максимальным значениями масштаба карты. Интерактивные элементы управления картой в Azure Maps для браузера и Android поддерживают 25 уровней масштаба (от 0 до 24). Выражение zoom
позволяет динамически изменять стили при изменении масштаба карты. Выражение zoom
можно использовать только с выражениями interpolate
и step
.
Пример
По умолчанию радиусы точек данных в слое тепловой карты имеют фиксированный размер в пикселях для всех уровней масштабирования. При изменении масштаба карты данные объединяются, и слой тепловой карты выглядит иначе. Выражение zoom
используется для изменения радиуса на всех уровнях масштабирования, чтобы каждая точка данных покрывала одну и ту же физическую область на карте. Это делает слой тепловой карты более статическим и согласованным. Каждый уровень масштабирования карты имеет в два раза больше пикселей по вертикали и горизонтали, чем предыдущий. Масштабирование радиуса, таким образом, что оно удвоится с каждым уровнем масштабирования, создает тепловую карту, которая выглядит согласованно на всех уровнях масштабирования. Для этого используйте выражение zoom
с выражением base 2 exponential interpolation
. Радиус пикселей должен быть задан для минимального уровня масштабирования, а масштабируемый радиус для максимального уровня вычисляется как 2 * Math.pow(2, minZoom - maxZoom)
, что показано в примере ниже.
HeatMapLayer layer = new HeatMapLayer(source,
heatmapRadius(
interpolate(
exponential(2),
zoom(),
//For zoom level 1 set the radius to 2 pixels.
stop(1, 2),
//Between zoom level 1 and 19, exponentially scale the radius from 2 pixels to 2 * (maxZoom - minZoom)^2 pixels.
stop(19, 2 * Math.pow(2, 19 - 1))
)
)
);
val layer = HeatMapLayer(source,
heatmapRadius(
interpolate(
exponential(2),
zoom(),
//For zoom level 1 set the radius to 2 pixels.
stop(1, 2),
//Between zoom level 1 and 19, exponentially scale the radius from 2 pixels to 2 * (maxZoom - minZoom)^2 pixels.
stop(19, 2 * Math.pow(2, 19 - 1))
)
)
)
Выражения привязки переменных
Выражения привязки переменных сохраняют результаты вычисления в переменной. Благодаря этому на результаты вычисления можно ссылаться в других местах выражения. Это полезная оптимизация выражений, включающих множество вычислений.
Expression | Возвращаемый тип | Description |
---|---|---|
let(Expression... input) |
Сохраняет одно или несколько значений в переменных для использования выражением var в дочернем выражении, которое возвращает результат. |
|
var(Expression expression) | var(string variableName) |
Object | Ссылается на переменную, созданную с помощью выражения let . |
Пример
В этом примере выражение вычисляет доход относительно коэффициента температуры, а затем выражение case
выполняет с этим значением различные логические операции. Выражение let
сохраняет доход относительно коэффициента температуры, поэтому его необходимо вычислить только один раз. Выражение var
ссылается на эту переменную по мере необходимости, чтобы не вычислять ее повторно.
BubbleLayer layer = new BubbleLayer(source,
bubbleColor(
let(
//Divide the point features `revenue` property by the `temperature` property and store it in a variable called `ratio`.
literal("ratio"), division(get("revenue"), get("temperature")),
//Evaluate the child expression in which the stored variable will be used.
switchCase(
//Check to see if the ratio is less than 100, return 'red'.
lt(var("ratio"), 100), color(Color.RED),
//Check to see if the ratio is less than 200, return 'green'.
lt(var("ratio"), 200), color(Color.GREEN),
//Return `blue` for values greater or equal to 200.
color(Color.BLUE)
)
)
)
);
val layer = BubbleLayer(source,
bubbleColor(
let(
//Divide the point features `revenue` property by the `temperature` property and store it in a variable called `ratio`.
literal("ratio"), division(get("revenue"), get("temperature")),
//Evaluate the child expression in which the stored variable will be used.
switchCase(
//Check to see if the ratio is less than 100, return 'red'.
lt(var("ratio"), 100), color(Color.RED),
//Check to see if the ratio is less than 200, return 'green'.
lt(var("ratio"), 200), color(Color.GREEN),
//Return `blue` for values greater or equal to 200.
color(Color.BLUE)
)
)
)
)
Следующие шаги
Дополнительные сведения о слоях, поддерживающих выражения: