为什么我有时不需要使用 'get' 而有时需要使用 'get' 进行过滤?
why should I sometimes don't need to use 'get' while othertimes need to use 'get' for filtering?
我正在尝试理解 mapboxgl.js 表达式。
我知道 'get' 用于获取属性中键的值,例如
['-', 2017, ['number', ['get', 'Constructi'], 2017]]
但是在某些情况下,要获取值,我不需要像
那样使用'get'
function filterBy(month) {
var filters = ['==', 'month', month];
map.setFilter('earthquake-circles', filters);
map.setFilter('earthquake-labels', filters);
// Set the label to the month
document.getElementById('month').textContent = months[month];
}
在这种情况下,我只需要输入'key'即'month'。
为什么有时我必须使用 'get' 而其他时候只需键入一个键就可以了?
我试图调整 mapbox 示例中的代码。
https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/
我只想显示悬停的多边形。
所以我加了一行
map.on('mousemove', 'state-fills', function (e) {
if (e.features.length > 0) {
if (hoveredStateId !== null) {
map.setFeatureState(
{ source: 'states', id: hoveredStateId },
{ hover: false }
);
}
hoveredStateId = e.features[0].id;
map.setFeatureState(
{ source: 'states', id: hoveredStateId },
{ hover: true }
);
}
map.setFilter('state-fills',['==',['feature-state','hover'],true])
});
它没有成功,所以我认为“出于某种原因”我必须添加 'get'。
所以我尝试了
map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])
也没成功。
所以我假设我可能必须添加 'boolean' 而不是 'get' 因为它会评估检索到的值是否为真。
map.setFilter('state-fills',['==',['boolean',['feature-state','hover'] ],true])
None 其中有工作。
我做错了什么?
您应该始终使用 get
访问属性。
不带 get
的版本是较旧的语法,仅部分受支持。如果你试图混合搭配,你会得到非常混乱的错误。例如:
filter: ['==', 'val', 1] // works
filter: ['==', ['get', 'val'], 2] // works
filter: ['any', ['==', 'val', 1'], ['==', ['get', 'val'], 2]] // doesn't work
然而,你在这里做什么:
map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])
这是错误的,因为 ['feature-state','hover']
不是属性,它是特征状态。
您不能按功能状态过滤。
解决方案 1
您可能想要执行以下操作:
map.setPaintProperty('state-fills', 'fill-opacity', ['case', ['to-boolean', ['feature-state','hover']], 1, 0.5]);
即:如果事物未悬停(或其他),则使用特征状态将填充不透明度设置为 0.5。
解决方案 2
map.setFilter('state-fills', ['==', ['id'], hoveredStateId]);
我正在尝试理解 mapboxgl.js 表达式。
我知道 'get' 用于获取属性中键的值,例如
['-', 2017, ['number', ['get', 'Constructi'], 2017]]
但是在某些情况下,要获取值,我不需要像
那样使用'get'function filterBy(month) {
var filters = ['==', 'month', month];
map.setFilter('earthquake-circles', filters);
map.setFilter('earthquake-labels', filters);
// Set the label to the month
document.getElementById('month').textContent = months[month];
}
在这种情况下,我只需要输入'key'即'month'。
为什么有时我必须使用 'get' 而其他时候只需键入一个键就可以了?
我试图调整 mapbox 示例中的代码。 https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/
我只想显示悬停的多边形。
所以我加了一行
map.on('mousemove', 'state-fills', function (e) {
if (e.features.length > 0) {
if (hoveredStateId !== null) {
map.setFeatureState(
{ source: 'states', id: hoveredStateId },
{ hover: false }
);
}
hoveredStateId = e.features[0].id;
map.setFeatureState(
{ source: 'states', id: hoveredStateId },
{ hover: true }
);
}
map.setFilter('state-fills',['==',['feature-state','hover'],true])
});
它没有成功,所以我认为“出于某种原因”我必须添加 'get'。 所以我尝试了
map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])
也没成功。 所以我假设我可能必须添加 'boolean' 而不是 'get' 因为它会评估检索到的值是否为真。
map.setFilter('state-fills',['==',['boolean',['feature-state','hover'] ],true])
None 其中有工作。 我做错了什么?
您应该始终使用 get
访问属性。
不带 get
的版本是较旧的语法,仅部分受支持。如果你试图混合搭配,你会得到非常混乱的错误。例如:
filter: ['==', 'val', 1] // works
filter: ['==', ['get', 'val'], 2] // works
filter: ['any', ['==', 'val', 1'], ['==', ['get', 'val'], 2]] // doesn't work
然而,你在这里做什么:
map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])
这是错误的,因为 ['feature-state','hover']
不是属性,它是特征状态。
您不能按功能状态过滤。
解决方案 1
您可能想要执行以下操作:
map.setPaintProperty('state-fills', 'fill-opacity', ['case', ['to-boolean', ['feature-state','hover']], 1, 0.5]);
即:如果事物未悬停(或其他),则使用特征状态将填充不透明度设置为 0.5。
解决方案 2
map.setFilter('state-fills', ['==', ['id'], hoveredStateId]);