- 起初让我研究的原因使一个报错:
layers.TRSA.filter[2][1][2]: string, number, or boolean expected, array found
我很确定筛选条件没问题,那么为何报错呢?百度,找到原因:
https://docs.mapbox.com/style-spec/reference/other/#other-filter
警告在样式规范的早期版本中,筛选器是使用下面记录的已弃用语法定义的。尽管使用此语法定义的筛选器将继续工作,但我们建议改用更灵活的表达式语法。表达式语法和下面已弃用的语法不能在单个筛选器定义中混合使用。
回到代码中看看我是如何混用了:
["all",
["!=","ac","EUR"],
["==","0", ["get", "res"]],
["==", 'X', ["get","t"]]
]
其中 [ "==", "0", ["get", "res"] ] 是新表达式的语法(expression语法)
转为旧语法(基于属性的filter语法(property-based filter syntax))为:[ "==","res","0" ]
下面看看官方文档
1.1 property-based filter syntax 官方文档
https://docs.mapbox.com/style-spec/reference/other/#other-filter
存在过滤器
["has", key]
feature[key]存在
["!has", key]
feature[key]不存在比较过滤器
["==", key, value]
平等:feature[key] = value
["!=", key, value]
不平等:≠feature[key]value
[">", key, value]
大于:feature[key] > value
[">=", key, value]
大于或等于:≥feature[key]value
["<", key, value]
小于:feature[key] < value
["<=", key, value]
小于或等于:≤feature[key]value设置成员资格筛选器
["in", key, v0, ..., vn]
设置包含: ∈ {, ...,feature[key]v0vn}
["!in", key, v0, ..., vn]
设置排除: ∉ { , ...,feature[key]v0vn}组合过滤器
["all", f0, ..., fn]
逻辑:∧......∧AND
f0fn
["any", f0, ..., fn]
逻辑:∨......∨OR
f0fn
["none", f0, ..., fn]
逻辑 : ¬ ∧ ...∧ ¬NOR
f0fnA 必须是标识功能属性的字符串,或者是以下特殊键之一:key
"$type"
:要素类型。此键可用于,, ,和运算符。可能的值为 、 和 。"=="
"!="
"in"
"!in"
"Point"
"LineString"
"Polygon"
"$id"
:要素标识符。此密钥可用于,, , , ,和运算符。"=="
"!="
"has"
"!has"
"in"
"!in"
A(对于集合运算符,和 、...)必须是字符串、数字或布尔值,以便与属性值进行比较。valuev0vn
设置成员资格筛选器是一种紧凑而有效的方法,用于测试字段是否与多个值中的任何一个匹配。
比较和设置成员资格筛选器实现严格类型的比较;例如,以下所有计算结果均为 false:、 、 。
0 < "1"
2 == "2"
"true" in [true, false]
、 和 filter 运算符用于创建复合过滤器。值 ...,本身必须是筛选器表达式。
"all"
"any"
"none"
f0fn["==", "$type", "LineString"]
此过滤器要求每个要素的属性等于“street_major”、“street_minor”或“street_limited”。
class
["in", "class", "street_major", "street_minor", "street_limited"]</code>
组合过滤器 “all” 采用其后面的其他三个过滤器,并要求它们都为 true 才能包含要素:要素必须等于 “street_limited”,其必须大于或等于 3,并且其类型不能为 Polygon。您可以将组合过滤器更改为“any”,以允许包含符合这些条件中的任何一个的要素 - 为面但具有不同值的要素,依此类推。
class
admin_level
class
["all",["==", "class", "street_limited"],[">=", "admin_level", 3],["!in", "$type", "Polygon"] ]
1.2 Expressions语法
https://docs.mapbox.com/style-spec/reference/expressions/#types-array
表达式
您可以将任何布局属性、绘画属性或过滤器的值定义为表达式。
表达式定义一个公式,用于使用下面描述的运算符计算属性的值。Mapbox GL 提供的表达式运算符包括:
- 用于对数值执行算术和其他运算的数学运算符
- 用于操作布尔值和做出条件决策的逻辑运算符
- 用于操作字符串的字符串运算符
- 数据运算符,用于提供对源要素属性的访问
- 相机操作员,用于提供对定义当前地图视图的参数的访问
表达式表示为 JSON 数组。表达式数组的第一个元素是命名表达式运算符的字符串,例如“*”或“case”。后面的元素(如果有)是表达式的参数。每个参数要么是文本值(字符串、数字、布尔值或),要么是另一个表达式数组。
null
[expression_name, argument_0, argument_1, ...]
数据表达式
数据表达式是访问要素数据的任何表达式,即使用数据运算符之一的任何表达式:get、has、id、geometry-type、properties 或 feature-state。数据表达式允许要素的属性或状态来确定其外观。它们可用于区分同一图层中的要素并创建数据可视化。
{"circle-color": ["rgb",// red is higher when feature.properties.temperature is higher["get", "temperature"],// green is always zero0,// blue is higher when feature.properties.temperature is lower["-", 100, ["get", "temperature"]]] }
此示例使用 get 运算符获取每个功能的值。该值用于计算 rgb 运算符的参数,根据其红色、绿色和蓝色分量定义颜色。
temperature
允许将数据表达式用作筛选器属性的值,以及大多数绘制和布局属性的值。但是,某些绘制和布局属性尚不支持数据表达式。支持级别由每个属性的“SDK 支持”表的“数据驱动样式”行指示。仅允许在绘制属性上使用带有特征状态运算符的数据表达式。
类型系统
表达式的输入参数及其结果值使用与样式规范的其余部分相同的一组类型:布尔值、字符串、数字、颜色和这些类型的数组。此外,表达式是类型安全的:表达式的每次使用都具有已知的结果类型和所需的参数类型,并且 SDK 会验证表达式的结果类型是否适合使用它的上下文。例如,filter 属性中表达式的结果类型必须是布尔值,并且 + 运算符的参数必须是数字。
使用要素数据时,SDK 通常不会提前知道要素属性值的类型。为了保持类型安全,在计算数据表达式时,SDK 将检查属性值是否适合上下文。例如,如果将表达式用于 circle-color 属性,则 SDK 将验证每个要素的值是否为标识有效颜色的字符串。如果此检查失败,将以特定于 SDK 的方式(通常是日志消息)指示错误,并将改用该属性的默认值。
["get", "feature-color"]
feature-color
在大多数情况下,此验证将在需要的地方自动进行。但是,在某些情况下,SDK 可能无法从周围上下文中自动确定数据表达式的预期结果类型。例如,不清楚表达式是尝试比较字符串还是数字。在这种情况下,可以使用类型断言表达式运算符之一来指示数据表达式的预期类型: 。类型断言检查要素数据是否与数据表达式的预期类型匹配。如果此检查失败,则会产生错误,并导致整个表达式回退到所定义属性的默认值。断言运算符为数组、布尔值、数字和字符串。
["<", ["get", "a"], ["get", "b"]]
["<", ["number", ["get", "a"]], ["number", ["get", "b"]]]
表达式仅执行一种隐式类型转换:在需要颜色的上下文中使用的数据表达式会将颜色的字符串表示形式转换为颜色值。在所有其他情况下,如果要在类型之间进行转换,则必须使用类型转换表达式运算符之一:to-boolean、to-number、to-string 或 to-color。例如,如果具有以字符串格式存储数值的 feature 属性,并且希望将这些值用作数字而不是字符串,则可以使用诸如 .
["to-number", ["get", "property-name"]]
如果表达式接受数组参数,并且用户提供数组文本,则该数组必须包装在表达式中(请参阅下面的示例)。当 GL-JS 遇到 style-spec 属性值中的数组时,它会假定该数组是一个表达式并尝试解析它;该库无法区分验证失败的表达式和数组文本,除非开发人员在运算符中明确了这种区别。如果数组是从子表达式返回的,则不需要运算符,例如 。
literal
literal
literal
["in", 1, ["get", "myArrayProp"]]
// will throw an error {"circle-color": ["in", 1, [1, 2, 3]] }// will work as expected {"circle-color": ["in", 1, ["literal", [1, 2, 3]]] }
- ps:Expressions语法在Mapbox Style Spec (样式规范)各属性中通用
{ "filter": ["all", ["all", ["!=", ["get","ac"],"EUR"],["==","0", ["get","res"]],["==", 'X', ["get","t"]]],["any", ["<", -1, ["literal",0]],// [// ">=", 'll_raw', -1// ], //旧规范[">=", -1, ["get","ll_raw"]] //新规范 表达式 新旧不能混用]],paint: {'text-color': '#fff','icon-color': [//表达式'case',['==', ['get', 'type'], 'B'],'#1E90FF','#FFA500'],},
}