Mapbox v2.14.1不接受筛选表达式?语法正确却报错
问题描述
我尝试为某图层设置筛选表达式,该图层所有要素的属性中均有名为"iri"的字符串类型字段,需进行简单的相等匹配判断。但Mapbox v2.14.1报错,提示与传入的筛选器不符。
控制台输出的筛选器对象为:
["==",["get","iri"],"some-iri-value"]
Mapbox的错误输出:
evented.js:151 Error: layers.my-layer.filter: array expected, string found at bs (validate_style.js:13:41) at iA (style.js:64:5) at aA._validate (style.js:2234:16) at aA.setFilter (style.js:1647:18) at Map.setFilter (map.js:2720:20)
我认为该语法正确,且在样式属性中可正常使用,请问我遗漏了什么?
解决方案
这个问题的核心是Mapbox GL JS v2.x版本的setFilterAPI和样式JSON的筛选规则存在差异:
- 样式JSON里支持数组格式的筛选表达式,但v2.x的
setFilter方法要求传入字符串化的数组表达式,而非直接传数组。 - 你直接传入数组会被判定为不符合参数要求,所以触发了"array expected, string found"的错误。
你可以通过两种方式解决:
- 将数组表达式转为JSON字符串传入
map.setFilter('my-layer', JSON.stringify(["==",["get","iri"],"some-iri-value"]));
- 使用简化的字符串筛选语法(无需
get表达式)
map.setFilter('my-layer', ['==', 'iri', 'some-iri-value']);
另外补充:Mapbox GL JS v3.x版本已经修复了这个不一致的问题,setFilter可以直接传入数组表达式,但v2.x版本仍需遵循上述规则。
内容的提问来源于stack exchange,提问作者Michael Hillman
相关产品推荐
相关产品推荐

