地图框:根据'tags'属性(数组)过滤要素



我有一些具有tags属性的功能,这是一个数组:

[
{
"type": "Feature",
"properties": {
"id":1,
"tags": ["tagA","tagB"]
}
},
{
"type": "Feature",
"properties": {
"id":2,
"tags": ["tagB","tagE"]
}
},
{
"type": "Feature",
"properties": {
"id":3,
"tags": ["tagZ","tagF"]
}
},
{
"type": "Feature",
"properties": {
"id":4,
"tags": ["tagN","tagP"]
}
},
{
"type": "Feature",
"properties": {
"id":5,
"tags": ["tagY","tagT"]
}
}
]

使用允许的标签列表,

const allowedTags = ['tagY','tagZ']

…Mapbox层过滤器将从我的输入中获得至少有一个标签的特征(在本例中,特征#3和#5)的语法是什么?

我测试了这个

const tagsFilter = ['in', ['get', 'tags'], ['literal', ['tagY','tagZ']]];
map.setFilter("markers",tagsFilter);

但是它不起作用。似乎这种语法更应该用于比较单个值,如

const idFilter = ['in', ['get', 'id'], ['literal', [3,5]]];

谢谢!

我发现这要感谢这个例子:

['any',
['in', 'tagY', ['get', 'tags']],
['in', 'tagZ', ['get', 'tags']]
]

我用它构造了一个函数:

function getTagsFilter(tags){
//no tags set
if ( (tags || []).length === 0) return;
//expression for each tag
const tagFilters = tags.map(tag=>['in',tag,['get', 'tags']])
return ['any'].concat(tagFilters);
}
const allowedTags = ['tagY','tagZ'];
map.setFilter("markers",getTagsFilter(allowedTags));//yeepee!

要排除这些标签,只需使用

map.setFilter("markers",['!',getTagsFilter(disabledTags)]);//yeepee again!

最新更新