跳到主要内容
版本:9.1.1

表达式

可将任何layout属性、paint属性或filter的值定义为表达式。

表达式定义了属性值的计算公式,可使用的操作符包括:

  • 算术和其他数值运算的数学运算符
  • 布尔运算和条件定义的逻辑运算符
  • 字符串操作的字符串运算符
  • 获取数据源要素属性的数据运算符
  • 获取定义当前地图视图参数的相机运算符

表达式是JSON数组,第一个元素为表达式操作符,例如"*"或"case",后面的元素(如果有的话)是表达式的参数。每个参数可以是一个文本值(字符串、数字、布尔值或null),也可以是另一个表达式数组。

[expression_name, argument_0, argument_1, ...]

相机表达式(Camera expressions)

相机表达式是使用zoom操作符的表达式。这些表达式根据地图缩放级别来改变图层的表达样式。

{
"circle-radius": [
"interpolate", ["linear"], ["zoom"],
// zoom 小于等于5 -> 圆的半径是1px
5, 1,
// zoom 大于等于10 -> 圆的半径是5px
10, 5
]
}

这个例子使用interpolate运算符,使用一组输入-输出定义缩放级别和圆大小之间的线性关系。在本例中,表达式表示当地图级别小于等于5时,圆的半径为1像素,当地图级别大于等于10时,圆半径应为5像素,而在两个缩放级别之间,圆的半径将是1到5像素间的线性插值。

你可以在可使用表达式的地方使用相机表达式。当你使用一个相机表达式作为paintlayout属性值时,它必须是以下形式之一:

[ "interpolate", interpolation, ["zoom"], ... ]

或者:

[ "step", ["zoom"], ... ]

或者:

[
"let",
... variable bindings...,
[ "interpolate", interpolation, ["zoom"], ... ]
]

或者:

[
"let",
... variable bindings...,
[ "step", ["zoom"], ... ]
]

也就是说,在paintlayout属性中,["zoom"]只能作为外部interpolatestep表达式的输入,或let表达式中的表达式。

对相机表达式的即时计算,paintlayout属性之间有一个重要的区别:

  • 对于paint属性,当地图层级发生变化时,即使是一个很小的变化,paint属性的相机表达式也将被重新计算。举个例子,当地图在级别4.1和4.6之间缩放时,paint属性的相机表达式将被不断地重新计算。
  • 对于layout属性,相机表达式只在整数地图层级时才被计算。比如,当地图层级从4.1变到4.6时,它不会被重新计算,只有当它超过5或低于4时,才会再进行计算。

复合表达式(Composition)

单个表达式可以混合使用数据运算符、相机运算符和其他运算符。这样的复合表达式可以使图层的样式综合地图层级和单个要素属性值来确定。

{
"circle-radius": [
"interpolate", ["linear"], ["zoom"],
// 当zoom是0,将每个要素的圆半径设为属性"rating"的值
0, ["get", "rating"],
// 当zoom是10,将每个要素的圆半径设为属性"rating"的4倍
10, ["*", 4, ["get", "rating"]]
]
}

同时使用数据和相机运算符的表达式被认为既是数据表达式也是相机表达式,所以必须遵守上述两者的规定。

数据表达式(Data expressions)

数据表达式是访问要素数据的表达式,即任何使用gethasidgeometry-typepropertiesfeature-state 的表达式。 数据表达式根据要素的属性或状态来定义要素的样式,可用来区分同一层的要素,实现数据可视化。

数据表达式可以作为filter以及大多数paintlayout属性的值,请确认paintlayout属性是否带有data-driven styling标识,另外feature-state操作符的数据表达式只允许在paint属性上使用。

{
"circle-color": [
"rgb",
// 当feature.properties.count的值越高,红色取值越高
["get", "count"],
// green is always zero
0,
// 当feature.properties.count的值越低,蓝色取值越高
["-", 100, ["get", "count"]]
]
}

这个例子使用get运算符来获取每个要素的count值,并用该值作为rgb操作符的参数,分别定义红、绿、蓝的值。

表达式参考(Expression reference)

类型

可以使用类型表达式测试和转换不同的数据类型(如字符串、数字和布尔值)。

通常在类型表达式中这种测试和转换是不必要的,但在某些子表达式的类型不明确的表达式中,它们可能是必要的。在要素数据类型不一致的情况下,它们也很有用,例如,您可以使用to-number来确保像"1.5"(而不是1.5)这样的值被视为数值。

array

断言输入是一个数组(可选,具有特定的项类型和长度)。 如果,在计算输入表达式时,它不是断言类型,则此断言将导致整个表达式被中止。

语法规则

["array", value]: array
["array", type: "string" | "number" | "boolean", value]: array<type>
["array",
type: "string" | "number" | "boolean",
N: number (literal),
value
]: array<type, N>

boolean

断言输入值是布尔值。 如果提供了多个值,则依次求值,直到得到一个布尔值。 如果输入值都不是布尔值,则表达式是错误的。

语法规则

["boolean", value]: boolean
["boolean", value, fallback: value, fallback: value, ...]: boolean

collator

返回一个用于与语言环境相关的比较操作的排序器。case-sensitivediacritic-sensitive的选项默认为false。 该参数指定要使用的语言环境的IETF语言标记。如果没有提供,则使用默认语言设置。如果请求的语言不可用,则将使用系统定义的后备语言环境。使用resolved-locale设置语言环境回退行为的结果。

语法规则

["collator",
{ "case-sensitive": boolean, "diacritic-sensitive": boolean, "locale": string }
]: collator

format

应用于text-field属性,可返回混合格式文本的格式化字符串。输入可以包含一个字符串字面值或表达式,包括一个'image'表达式。字符串后面可以跟一个重写样式的对象,支持重写的样式属性包括:

  • "text-font":覆盖由layout属性指定的字体。
  • "text-color":覆盖由paint属性指定的颜色。
  • "font-scale":对layout属性指定的text-size应用缩放因子。

语法规则

["format",
input_1: string | image, options_1: { "font-scale": number, "text-font": array<string>, "text-color": color },
...,
input_n: string | image, options_n: { "font-scale": number, "text-font": array<string>, "text-color": color }
]: formatted

image

返回一个ResolvedImage,可用于icon-image*-pattern以及'format'表达式中的一部分。包含image'coalesce'表达式将计算出当前样式中的第一个图像,此验证过程是同步的,并且要求在'image'请求前要将图像添加到样式中。

语法规则

["image", value]: image

literal

提供文字数组或对象值。

语法规则

["literal", [...] (JSON array literal)]: array<T, N>
["literal", [...] (JSON array literal)]: array<T, N>

number

断言输入值是一个数字。如果提供了多个值,则依次计算每个值,直到获得一个数字。如果输入值中没有数字,则表达式是错的。

语法规则

["number", value]: number
["number", value, fallback: value, fallback: value, ...]: number

number-format

使用提供的格式化规则将输入的数字转换为字符串表示形式。如果设置了locale参数指定要使用的语言环境,并作为BCP 47语言标记。如果设置了currency参数指定用于货币样式格式化的ISO 4217代码。如果设置了min-fraction-digitsmax-fraction-digits参数指定要包含的最小和最大分数位数。

语法规则

["number-format",
input: number,
options: { "locale": string, "currency": string, "min-fraction-digits": number, "max-fraction-digits": number }
]: string

object

断言输入值是一个对象。如果提供了多个值,则依次求值,直到获得对象为止。如果没有一个输入值是对象,则表达式是错的。

语法规则

["object", value]: object
["object", value, fallback: value, fallback: value, ...]: object

string

断言输入值是一个字符串。如果提供了多个值,则依次计算每个值,直到获得一个字符串。如果输入的值都不是字符串,则表达式是错的。

语法规则

["string", value]: string
["string", value, fallback: value, fallback: value, ...]: string

to-boolean

将输入值转换为布尔值。当输入为空字符串、0falsenullNaN时,结果为false,否则为true

语法规则

["to-boolean", value]: boolean

to-color

将输入值转换为颜色。如果提供了多个值,则依次计算每个值,直到获得第一次成功的转换。如果任何输入值都不能转换,则表达式是错误的。

语法规则

["to-color", value, fallback: value, fallback: value, ...]: color

to-number

将输入值转换为数字。如果输入为nullfalse,则结果为0。如果输入为true,则结果为1。如果输入是字符串,它会依据ECMAScript语言规范中的算法转化成指定的数值。如果提供了多个值,则依次计算每个值,直到获得第一次成功的转换。如果任何输入值都不能转换,则表达式是错误的。

语法规则

["to-number", value, fallback: value, fallback: value, ...]: number

to-string

将输入值转换为字符串。如果输入为null,则结果为""。 如果输入的是布尔值,则结果为"true""false"。如果输入是一个数字,它会依据ECMAScript语言规范中的算法转化成指定的字符串。如果输入是一种颜色,它会被转换为"rgba(r,g,b,a)"形式的字符串,其中r,g,b是0到255的数字,a是0到1的数字。如果输入是'image'表达式,'to-string'返回图像名称。否则,输入将被转换为ECMAScript语言规范的JSON.stringify函数指定格式的字符串。

语法规则

["to-string", value]: string

typeof

返回给定值的类型。

语法规则

["typeof", value]: string

要素数据

accumulated

返回到目前为止累积的聚合属性的值。只能在聚合GeoJSON源的clusterProperties选项中使用。

语法规则

["accumulated"]: value

feature-state

从当前要素状态中获取属性值。如果请求的属性不属于要素状态,则返回null。要素的状态不是GeoJSON或矢量切片数据中的一部分,必须通过编程方式对每个要素进行设置。要素由其id属性标识,id属性必须是整数或可以转换为整数的字符串。注意,["feature-state"]只能用于支持数据驱动样式的paint属性。

语法规则

["feature-state", string]: value

geometry-type

返回要素的几何类型:Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon。 Multi*要素类型只会出现在GeoJSON数据源中,而使用矢量瓦片源时,只有单一形式。

语法规则

["geometry-type"]: string

id

返回特性的id(如果有的话)。

语法规则

["id"]: value

line-progress

沿渐变线返回进度。 只能在line-gradient属性中使用。

语法规则

["line-progress"]: number

properties

返回特性属性对象。 注意,在某些情况下,直接使用["get", "property_name"]可能更有效。

语法规则

["properties"]: object

查找

at

从数组中查询项。

语法规则

["at", number, array]: ItemType

get

从当前要素的属性中获取属性值,如果设置了第二个参数,则从另一个对象获取属性值。如果请求的属性缺失,则返回null

语法规则

["get", string]: value
["get", string, object]: value

has

测试当前要素属性中是否存在属性值,如果设置了第二个参数,则测试来自另一个对象的属性值。

语法规则

["has", string]: boolean
["has", string, object]: boolean

in

确定数组中是否存在项,或字符串中是否存在子字符串。在第二个和第三个参数是字符串字面值的特定情况下,必须至少将其中一个包在literal表达式中,以便向类型系统提供正确的解释。

语法规则

["in",
keyword: InputType (boolean, string, or number),
input: InputType (array or string)
]: boolean

index-of

返回在数组中可以找到项的第一个位置,或在字符串中可以找到子字符串的第一个位置,如果找不到,则返回-1。 接受从任意位置开始搜索的可选索引。

语法规则

["index-of",
keyword: InputType (boolean, string, or number),
input: InputType (array or string)
]: number
["index-of",
keyword: InputType (boolean, string, or number),
input: InputType (array or string),
index: number
]: number

length

返回数组或字符串的长度。

语法规则

["length", string | array | value]: number

slice

从数组或者字符串中提取项,或从指定起始索引的字符串中返回子字符串,如果设置了结束索引,则返回起始索引和结束索引之间的子字符串。返回值包括开始索引,但不包括结束索引。

语法规则

["slice",
input: InputType (array or string),
index: number
]: OutputType (ItemType or string)
["slice",
input: InputType (array or string),
index: number,
index: number
]: OutputType (ItemType or string)

Camera

distance-from-center

返回symbol到地图中心的距离。 距离的度量单位是像素除以地图容器的高度。 它在中心处的值为0,靠近摄像机时减小,远离摄像机时增大。 例如,如果地图的高度是1000px,值-1表示从中心到摄像机的距离为1000px,值1表示从摄像机到中心的距离为1000px。 ["distance-from-center"]只能在符号层的过滤器表达式中使用。

语法规则

["distance-from-center"]: number

Color

rgb

创建红色、绿色和蓝色的颜色值,其范围必须在0到255之间,alpha为1。 如果任何值超出范围,则表达式将出错。

语法规则

["rgb", number, number, number]: color

rgba

创建红色、绿色、蓝色的颜色值,其范围必须在0到255之间,以及alpha的范围必须在0到1之间。 如果任何值超出范围,则表达式将出错。

语法规则

["rgba", number, number, number, number]: color

to-rgba

返回一个包含输入颜色的红色、绿色、蓝色和alpha元素的四元素数组。

语法规则

["to-rgba", color]: array<number, 4>

Decision

您可以使用决策表达式向样式中添加条件逻辑。 例如,'case'表达式提供了"if/then/else"逻辑,而'match'则允许您将输入表达式的特定值映射到不同的输出表达式。

!

逻辑的否定。 如果输入为false则返回true,如果输入为true则返回false

语法规则

["!", boolean]: boolean

!=

如果输入值不相等则返回true,否则返回false。 严格类型化比较:不同运行时类型的值总是被认为不相等。 在解析时已知类型不同的情况被认为是无效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

["!=", value, value]: boolean
["!=", value, value, collator]: boolean

<

如果第一个输入严格小于第二个输入则返回true,否则返回false。 输入值必须是两个字符串或两个数字; 如果在求值过程中并不是字符串或数字,则表达式求值将产生错误。 已知该约束在解析时不存在的情况被认为是有效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

["<", value, value]: boolean
["<", value, value, collator]: boolean

<=

如果第一个输入小于或等于第二个输入则返回true,否则返回false。 输入值必须是两个字符串或两个数字; 如果在求值过程中并不是字符串或数字,则表达式求值将产生错误。 已知该约束在解析时不存在的情况被认为是有效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

["<=", value, value]: boolean
["<=", value, value, collator]: boolean

==

如果输入值相等则返回true,否则返回false。 严格类型化比较:不同运行时类型的值总是被认为不相等。 在解析时已知类型不同的情况被认为是无效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

["==", value, value]: boolean
["==", value, value, collator]: boolean

>

如果第一个输入严格大于第二个输入则返回true,否则返回false。 输入值必须是两个字符串或两个数字; 如果在求值过程中并不是字符串或数字,则表达式求值将产生错误。 已知该约束在解析时不存在的情况被认为是有效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

[">", value, value]: boolean
[">", value, value, collator]: boolean

>=

如果第一个输入大于或等于第二个输入则返回true,否则返回false。 输入值必须是两个字符串或两个数字; 如果在求值过程中并不是字符串或数字,则表达式求值将产生错误。 已知该约束在解析时不存在的情况被认为是有效的,并将产生一个解析错误。 接受一个可选的collator参数,以便于控制与设置相关的字符串比较。

语法规则

[">=", value, value]: boolean
[">=", value, value, collator]: boolean

all

如果所有输入条件都为true,则返回ture,否则返回假false。 按照条件输入顺序求值,求值是短路的:当其中一个输入表达式求值为false时,结果就为false,不再对其他输入表达式进行求值。

语法规则

["all", boolean, boolean]: boolean
["all", boolean, boolean, ...]: boolean

any

如果输入条件任意一个为true,则返回true,否则返回false。 按照条件输入顺序求值,求值是短路的:当其中一个输入表达式求值为true时,结果就为true,不再对其他输入表达式进行求值。

语法规则

["any", boolean, boolean]: boolean
["any", boolean, boolean, ...]: boolean

case

选择对应测试条件评估为 true 的第一个输出,否则就选择后退值。

语法规则

["case",
condition: boolean, output: OutputType,
condition: boolean, output: OutputType,
...,
fallback: OutputType
]: OutputType

coalesce

依次计算每个表达式,直到获得第一个有效值。 无效的值是null和在样式中不可用的'image'表达式。 如果所有值都是无效的,则coalesce返回列出的第一个值。

语法规则

["coalesce", OutputType, OutputType, ...]: OutputType

match

选择标签值与输入值相匹配的输出,如果没有找到匹配,则选择后备值。输入值可以是任何表达式(例如,["get", "building_type"])。每个标签必须是唯一的,并且必须是以下任何一种:

  • 单个字面值;
  • 文字值数组,其值必须为所有字符串或所有数字(例如[100,101]["c", "b"])。

如果数组中的任何值使用严格相等匹配,则输入匹配,类似于"in"操作符。 如果输入类型与标签类型不匹配,则输出结果为回退值。

语法规则

["match",
input: InputType (number or string),
label: InputType | [InputType, InputType, ...], output: OutputType,
label: InputType | [InputType, InputType, ...], output: OutputType,
...,
fallback: OutputType
]: OutputType

within

如果被求值的特征完全包含在输入几何图形的边界内则返回true,否则返回false。 输入值可以是一个有效的GeoJSON,类型为PolygonMultiPolygonFeatureFeatureCollection。 支持的功能有:

  • Point: 如果一个点在边界上或落在边界之外,则返回false
  • LineString:如果线的任何部分落在边界之外,或线与边界相交,或线的端点在边界上,则返回false

语法规则

["within", object]: boolean

Heatmap

heatmap-density

返回热力图层中像素的核密度估计,这是一个相对度量,用于度量特定像素周围拥挤的数据点的数量。 只能在热力图颜色属性中使用。

语法规则

["heatmap-density"]: number

Math

-

对于两个输入,返回第一个输入减去第二个输入的结果。 对于单个输入,返回用0减去它的结果。

语法规则

["-", number, number]: number
["-", number]: number

*

返回输入的乘积。

语法规则

["*", number, number, ...]: number

/

返回第一个输入除以第二个输入的浮点除法的结果。

语法规则

["/", number, number]: number

%

返回第一个输入被第二个输入整除后的余数。

语法规则

["%", number, number]: number

^

返回指定数字(第一个输入)的指定次(第二次输入)幂

语法规则

["^", number, number]: number

+

返回输入值的和

语法规则

["+", number, number, ...]: number

abs

返回输入的绝对值。

语法规则

["abs", number]: number

acos

返回输入的反余弦值。

语法规则

["acos", number]: number

asin

返回输入的反正弦值。

语法规则

["asin", number]: number

atan

返回输入的反正切值。

语法规则

["atan", number]: number

ceil

返回大于或等于输入的最小整数。

语法规则

["ceil", number]: number

cos

返回输入的余弦值。

语法规则

["cos", number]: number

distance

返回计算后的feature与输入几何图形之间的最短距离(以米为单位)。 输入值可以是一个有效的GeoJSON,类型为PointMultiPointLineStringMultiLineStringPolygonMultiPolygonFeatureFeatureCollection。 由于编码几何图形的精度降低,返回的距离值的精度可能会有所不同,特别是在缩放级别为13以下。

语法规则

["distance", object]: number

e

返回数学常数e。

语法规则

["e"]: number

floor

返回小于或等于输入的最大整数。

语法规则

["floor", number]: number

ln

返回输入的自然对数。

语法规则

["ln", number]: number

ln2

返回数学常数ln(2)。

语法规则

["ln2"]: number

log10

返回输入的以10为底的对数。

语法规则

["log10", number]: number

log2

返回输入的以2为底的对数。

语法规则

["log2", number]: number

max

返回输入的最大值。

语法规则

["max", number, number, ...]: number

min

返回输入的最小值。

语法规则

["min", number, number, ...]: number

pi

返回数学常数pi。

语法规则

["pi"]: number

round

将输入四舍五入到最接近的整数。 中间值从零四舍五入。 例如,["round", -1.5]的计算结果为-2。

语法规则

["round", number]: number

sin

返回输入的正弦值。

语法规则

["sin", number]: number

sqrt

返回输入的平方根。

语法规则

["sqrt", number]: number

tan

返回输入的正切值。

语法规则

["tan", number]: number

pitch

返回当前倾斜度(以度为单位)。 ["pitch"]只能在symbol的过滤器表达式中使用。

语法规则

["pitch"]: number

zoom

返回当前缩放级别。 注意,在样式布局和绘制属性中,["zoom"]只能作为顶级的"step"或"interpolate"表达式的输入

语法规则

["zoom"]: number

Ramps, scales, curves

interpolate

通过在输入值和输出值("stop")之间插入来产生连续的、平滑的结果。 输入可以是任何数值表达式(例如,["get", "population"])。 停止输入值必须是严格升序的数字字面值。 输出类型必须为numberarray<number>color

插值类型:

  • ["linear"]: 在刚好小于和刚好大于输入的一对止点之间进行线性插值。
  • ["exponential", base]: 在小于和大于输入的点之间进行指数插值。 Base控制输出增长的速率:值越高,输出增长越接近范围的高端。 当值接近1时,输出线性增加。
  • ["cubic-bezier", x1, y1, x2, y2]: 使用给定控制点定义的三次bezier曲线进行插值。

语法规则

["interpolate",
interpolation: ["linear"] | ["exponential", base] | ["cubic-bezier", x1, y1, x2, y2],
input: number,
stop_input_1: number, stop_output_1: OutputType,
stop_input_n: number, stop_output_n: OutputType, ...
]: OutputType (number, array<number>, or Color)

interpolate-hcl

通过对输入和输出值("站")进行插值,产生连续、平滑的结果。工作原理类似于插值,但输出类型必须是彩色的,插值是在Hue-Chroma-Luminance色彩空间中进行。

语法规则

["interpolate-hcl",
interpolation: ["linear"] | ["exponential", base] | ["cubic-bezier", x1, y1, x2, y2],
input: number,
stop_input_1: number, stop_output_1: Color,
stop_input_n: number, stop_output_n: Color, ...
]: Color

interpolate-lab

通过在输入值和输出值("stop")之间插入来产生连续的、平滑的结果。像 interpolate 一样工作,但是输出类型必须是颜色,并且插值是在CIELAB颜色空间中执行的。

语法规则

["interpolate-lab",
interpolation: ["linear"] | ["exponential", base] | ["cubic-bezier", x1, y1, x2, y2 ],
input: number,
stop_input_1: number, stop_output_1: Color,
stop_input_n: number, stop_output_n: Color, ...
]: Color

step

通过对输入和输出值("stop")定义的分段常数函数求值,产生离散的阶梯结果。 输入可以是任何数值表达式(例如,["get", "population"])。 停止输入值必须是严格升序的数字字面值。 返回stop的输出值刚好小于输入值,如果输入小于第一个stop,则返回第一个输出值。

语法规则

["step",
input: number,
stop_output_0: OutputType,
stop_input_1: number, stop_output_1: OutputType,
stop_input_n: number, stop_output_n: OutputType, ...
]: OutputType

String

concat

返回由输入值串联组成的字符串。 每个输入都被转换成字符串,就像通过to-string一样。

语法规则

["concat", value, value, ...]: string

downcase

返回转换为小写的输入字符串。 遵循Unicode默认大小写转换算法和Unicode字符数据库中不区分地区的大小写映射。

语法规则

["downcase", string]: string

is-supported-script

如果预期输入的字符串可以清晰地呈现,则返回true。如果输入字符串包含无法在不损失意义的情况下呈现的部分,则返回false(例如,如果Mapmost GL JS中没有使用mapmost-gl-rtl-text插件,则需要复杂文本整形的Indic脚本,或从右到左的脚本)。

语法规则

["is-supported-script", string]: boolean

resolved-locale

返回所提供的整理器正在使用的区域性IETF语言标签。这可以用来确定系统的默认语言,或者确定所请求的语言是否被成功加载。

语法规则

["resolved-locale", collator]: string

upcase

返回转换为大写的输入字符串。遵循Unicode默认的大小写转换算法和Unicode字符库中不分大小写的本地映射。

语法规则

["upcase", string]: string

Variable binding

let

将表达式绑定到命名变量,然后可以使用["var", "variable_name"]在结果表达式中引用。

语法规则

["let",
string (alphanumeric literal), any, string (alphanumeric literal), any, ...,
OutputType
]: OutputType

var

使用"let"引用变量绑定。

语法规则

["var", previously bound variable name]: the type of the bound expression

类型系统(Type system)

表达式的输入参数及结果值使用的类型集包括:booleanstringnumbercolor和这些类型的数组。此外,表达式需类型安全:表达式有一个已知的结果类型和必需的参数类型,SDK会验证表达式的结果类型是否适合使用它的上下文。例如,filter属性的表达式结果类型必须是boolean±操作符的参数必须是number

通常,SDK在处理要素数据前不知道要素属性值的类型。为了保证类型安全,在计算数据表达式时,SDK将检查属性值是否适合上下文。例如,如果你将circle-color属性设置为表达式["get", "feature-color"], SDK将验证每个要素的feature-color值是否是一个有效的颜色字符串。如果该检查失败,将以SDK特定的方式(通常是日志消息)输出一个错误,并使用该属性的默认值。

在大多数情况下,这种核查将在任何需要的地方自动进行。但是,在某些情况下,SDK可能无法从周围的上下文自动确定数据表达式的预期结果类型。例如,不清楚表达式["<",["get", "a"], ["get", "b"]]是比较字符串还是数值。在这种情况下,可以使用类型断言表达式操作符之一来指示数据表达式的预期类型:["<",["number", ["get", "a"]], ["number", ["get", "b"]]。类型断言检查要素数据是否与数据表达式的预期类型匹配。如果这个检查失败,它将输出一个错误,并导致整个表达式返回所定义属性的默认值。断言操作符包括arraybooleannumberstring

表达式只执行一种隐式类型转换:当需要一个颜色时,数据表达式会将用字符串表达的颜色转换为颜色值。在所有其他情况下,如果要转换类型,必须使用一个类型转换表达式运算符:to-booleanto-numberto-stringto-color。 例如,如果有一个要素属性以字符串格式存储数值,而你希望将这些值用作数值而不是字符串,那么您可以使用["to-number", ["get", "property-name"]]这样的表达式。

如果一个表达式接受一个数组参数,而用户提供了一个数组实量,那么这个数组必须被包装在一个literal表达式中(参见下面的例子)。 当SDK遇到样式规范属性值中的数组时,它会假设该数组是一个表达式,并尝试解析它;SDK没有办法区分验证失败的表达式和数组实量,除非开发人员用literal操作符显式地进行区分。如果数组是由子表达式返回的,例如["in", 1, ["get", "myArrayProp"]],则不需要literal操作符。

// 将抛出一个错误
{
"circle-color": ["in", 1, [1, 2, 3]]
}

// 将如预期运行
{
"circle-color": ["in", 1, ["literal", [1, 2, 3]]]
}