Поделиться через


Выражения стиля на основе данных (пакет SDK для Android)

Примечание.

Прекращение использования пакета SDK для Android для Azure Карты

Пакет SDK для машинного кода Azure для Android Карты теперь устарел и будет прекращен 3.31.25. Чтобы избежать сбоев в работе служб, перейдите в веб-пакет SDK для Azure Карты на 3.31.25. Дополнительные сведения см. в руководстве по миграции пакета SDK для Android Карты Azure.

Выражения позволяют применять бизнес-логику к параметрам стилей, которые используют свойства, определенные в каждой фигуре источника данных. Выражения позволяют фильтровать данные в источнике или слое. Выражения могут включать условную логику, например операторы 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)
            )
        )
    )
)

Следующие шаги

Дополнительные сведения о слоях, поддерживающих выражения: