Mapbox中如何结合多属性设置图层文本大小:固定指定点大小,其余点随缩放级别动态调整
Mapbox中如何结合多属性设置图层文本大小:固定指定点大小,其余点随缩放级别动态调整
嘿,我完全懂你这个困扰!你想在同一个图层里实现两种文本大小规则——指定ID的点固定16号,剩下的随地图缩放动态变化,之前的写法因为Mapbox表达式的层级限制报错了对吧?其实不用拆分图层,只要调整一下表达式的嵌套结构就能搞定!
先给你说清楚为什么之前的写法不行:Mapbox的zoom表达式有严格的层级要求,它只能作为顶层interpolate或step表达式的输入,不能嵌套在match的 fallback 分支里,这就是你看到那个报错的原因。
那正确的思路是把逻辑反过来:把match判断嵌套到interpolate的每个输出分支里,让zoom始终是顶层表达式的输入。直接上可用的代码:
this.map.setLayoutProperty('layer', 'text-size', [ 'interpolate', ['linear'], ['zoom'], // 当缩放级别为6时 6, ['match', ['get', 'id'], idsToShow, 16, 6], // 当缩放级别为8时 8, ['match', ['get', 'id'], idsToShow, 16, 16] ]);
我给你拆解一下这段代码的逻辑:
- 顶层是
interpolate,以zoom为输入,完全符合Mapbox的规则,不会触发报错 - 在每个缩放节点(比如zoom=6、zoom=8)的输出值里,用
match做判断:- 如果当前点的
id在idsToShow列表里,直接返回固定大小16 - 否则返回当前缩放级别对应的动态大小
- 如果当前点的
- 对于6到8之间的缩放级别,非指定点的大小会自动线性插值过渡,而指定ID的点全程保持16号大小
这样既满足了你的两个需求,又不用把数据拆成两个图层,完美解决问题!
备注:内容来源于stack exchange,提问作者Max Douglas
相关产品推荐
相关产品推荐

