如何仅在具有美国世界观的国家边界上设置过滤器?
How to set filter only on country boundaries with US worldview?
我正在使用 Mapbox GL 为国家/地区动态着色。有些国家是红色的,有些是绿色的。
为此,我使用 country-boundaries-v1 源,然后使用来自 country-boundaries 的 iso_3166-1 数据在使用 country-boundaries 源的图层上设置过滤器。
这是我添加图层的代码:
addLayers (map, layers) {
layers.forEach((layer) => {
map.addLayer({
id: layer.id,
source: layer.source,
'source-layer': layer.sourceLayer,
layout: {
visibility: 'none'
},
type: 'fill',
paint: {
'fill-opacity': 0.5
}
}, 'country-label')
})
},
还有一个地方可以让我的图层可见,添加颜色并在 iso_3166-1 代码列表中设置我的滤镜:
map.setLayoutProperty(state.id, 'visibility', 'visible')
map.setPaintProperty(state.id, 'fill-color', this.layerColor(formattedState))
map.setFilter('positive-countries', ['in', 'iso_3166_1', 'FR', 'BE', 'IN', 'CN', 'JP'])
问题是,当我在不透明度降低的图层上添加 'fill-color' 属性 时,具有不同世界观的国家(如中国、日本、印度)因此具有重叠的图层。结果是一些国家没有一个不透明度为 0.6 的图层,而是有 3 个不透明度为 0.6 的图层,这使它们不透明。
我试着添加这个:
map.setFilter('positive-countries', ['match', ['get', 'worldview'], ['all', 'US'], true, false])
希望Mapbox只用美国的世界观,但是不行
这是我的地图的屏幕截图,您可以看到问题所在:
如您所见,中国、印度和日本等国家有多个层次,因为这些国家有多种世界观,所以它们看起来与其他国家不同。
有谁知道我想做的事情是否可行?
编辑:
我试过这个:
const filters = [
'any',
['in', 'iso_3166_1', 'MA', 'BR'],
['==', 'all', ['get', 'worldview']],
['in', 'US', ['get', 'worldview']]
]
map.setFilter('positive-countries', filters)
但是我遇到了这些错误:
mapbox-gl.js:31 Error: layers.positive-countries.filter[2][2]: string, number, or boolean expected, array found
mapbox-gl.js:31 Error: layers.positive-countries.filter[3][2]: string, number, or boolean expected, array found
如果我删除 ['in', 'iso_3166_1', 'MA', 'BR'],
就不会再出现错误,但当然我的地图上没有应用过滤器。
所以,我尝试了这个:
const filters = [
'any',
['==', 'all', ['get', 'worldview']],
['in', 'US', ['get', 'worldview']]
]
map.setFilter(params['id'], filters)
map.setFilter(params['id'], ['in', 'iso_3166_1', 'MA', 'BR'])
但是世界观上没有过滤结果是一样的...
如果其他人遇到同样的问题,这就是解决方案:
const filters = [
'all',
['match', ['get', 'worldview'], ['all', 'US'], true, false],
['match', ['get', 'iso_3166_1'], ['MA', 'BR'], true, false]
]
this.map.setFilter(layerId, filters)
然后只有美国看到的国家可见
我正在使用 Mapbox GL 为国家/地区动态着色。有些国家是红色的,有些是绿色的。
为此,我使用 country-boundaries-v1 源,然后使用来自 country-boundaries 的 iso_3166-1 数据在使用 country-boundaries 源的图层上设置过滤器。
这是我添加图层的代码:
addLayers (map, layers) {
layers.forEach((layer) => {
map.addLayer({
id: layer.id,
source: layer.source,
'source-layer': layer.sourceLayer,
layout: {
visibility: 'none'
},
type: 'fill',
paint: {
'fill-opacity': 0.5
}
}, 'country-label')
})
},
还有一个地方可以让我的图层可见,添加颜色并在 iso_3166-1 代码列表中设置我的滤镜:
map.setLayoutProperty(state.id, 'visibility', 'visible')
map.setPaintProperty(state.id, 'fill-color', this.layerColor(formattedState))
map.setFilter('positive-countries', ['in', 'iso_3166_1', 'FR', 'BE', 'IN', 'CN', 'JP'])
问题是,当我在不透明度降低的图层上添加 'fill-color' 属性 时,具有不同世界观的国家(如中国、日本、印度)因此具有重叠的图层。结果是一些国家没有一个不透明度为 0.6 的图层,而是有 3 个不透明度为 0.6 的图层,这使它们不透明。
我试着添加这个:
map.setFilter('positive-countries', ['match', ['get', 'worldview'], ['all', 'US'], true, false])
希望Mapbox只用美国的世界观,但是不行
这是我的地图的屏幕截图,您可以看到问题所在:
如您所见,中国、印度和日本等国家有多个层次,因为这些国家有多种世界观,所以它们看起来与其他国家不同。
有谁知道我想做的事情是否可行?
编辑:
我试过这个:
const filters = [
'any',
['in', 'iso_3166_1', 'MA', 'BR'],
['==', 'all', ['get', 'worldview']],
['in', 'US', ['get', 'worldview']]
]
map.setFilter('positive-countries', filters)
但是我遇到了这些错误:
mapbox-gl.js:31 Error: layers.positive-countries.filter[2][2]: string, number, or boolean expected, array found
mapbox-gl.js:31 Error: layers.positive-countries.filter[3][2]: string, number, or boolean expected, array found
如果我删除 ['in', 'iso_3166_1', 'MA', 'BR'],
就不会再出现错误,但当然我的地图上没有应用过滤器。
所以,我尝试了这个:
const filters = [
'any',
['==', 'all', ['get', 'worldview']],
['in', 'US', ['get', 'worldview']]
]
map.setFilter(params['id'], filters)
map.setFilter(params['id'], ['in', 'iso_3166_1', 'MA', 'BR'])
但是世界观上没有过滤结果是一样的...
如果其他人遇到同样的问题,这就是解决方案:
const filters = [
'all',
['match', ['get', 'worldview'], ['all', 'US'], true, false],
['match', ['get', 'iso_3166_1'], ['MA', 'BR'], true, false]
]
this.map.setFilter(layerId, filters)
然后只有美国看到的国家可见