分类数据的 Mapbox 数据驱动样式 - 如何将表达式与数组输入匹配?
Mapbox data-driven styles for categorical data - how to match expression with array inputs?
我有一个将多边形动态添加到 Mapbox 图层的应用程序。我正在使用匹配表达式来设置多边形填充的样式,但我在使用数组输入确定表达式的语法时遇到了问题。
这是我正在尝试做的一个简单示例:https://stackblitz.com/edit/angular-bpuswd?file=src%2Fapp%2Fapp.component.ts
我有一个具有特征 属性 states
的图层。我想根据 this official mapbox example for data-driven styles:
将每个状态与不同的填充颜色相关联
// want to match New York to color #F0F and Pennsylvania to color #FF0
const states = ['New York', 'Pennsylvania'];
const colors = ['#F0F', '#FF0'];
const statesAndColors = ['New York', '#F0F', 'Pennsylvania', '#FF0'];
this.map.addLayer({
id: 'states',
type: 'fill',
source: {
type: 'geojson',
data: POLYGONS,
},
paint: {
// doesn't work
'fill-color': ['match', ['string', ['get', 'state']], states, colors, '#AAAAAA']
// also doesn't work
// 'fill-color': ['match', ['string', ['get', 'state']], statesAndColors, '#AAAAAA']
// below example works
// 'fill-color': ['match', ['string', ['get', 'state']], 'New York', '#F0F', 'Pennsylvania', '#FF0', '#AAAAAA']
}
});
mapbox expression match 文档指出您可以使用 'an array of literal values, whose values must be all strings or all numbers (e.g. [100, 101] or ["c", "b"]). The input matches if any of the values in the array matches, similar to the deprecated "in" operator.'
但是我上面的例子并没有像我预期的那样工作。如何格式化表达式以将这些样式作为数组读取? (注意:这个示例应用程序可以很好地使用直接匹配,因为纽约和宾夕法尼亚的值是硬编码的,但我的实际应用程序有动态上传的多边形,所以它们在运行时是未知的。)
您的问题只是 Javascript 语法问题。 statesAndColors
是一个数组,而您需要传入数组的各个值。您可以使用扩展运算符 (...
) 来做到这一点。
所以,改变这个:
'fill-color': ['match', ['string', ['get', 'state']], statesAndColors, '#AAAAAA']
对此:
'fill-color': ['match', ['string', ['get', 'state']], ...statesAndColors, '#AAAAAA']
(来源:我实际上在您引用的文档中写下了这句话 :))
我有一个将多边形动态添加到 Mapbox 图层的应用程序。我正在使用匹配表达式来设置多边形填充的样式,但我在使用数组输入确定表达式的语法时遇到了问题。
这是我正在尝试做的一个简单示例:https://stackblitz.com/edit/angular-bpuswd?file=src%2Fapp%2Fapp.component.ts
我有一个具有特征 属性 states
的图层。我想根据 this official mapbox example for data-driven styles:
// want to match New York to color #F0F and Pennsylvania to color #FF0
const states = ['New York', 'Pennsylvania'];
const colors = ['#F0F', '#FF0'];
const statesAndColors = ['New York', '#F0F', 'Pennsylvania', '#FF0'];
this.map.addLayer({
id: 'states',
type: 'fill',
source: {
type: 'geojson',
data: POLYGONS,
},
paint: {
// doesn't work
'fill-color': ['match', ['string', ['get', 'state']], states, colors, '#AAAAAA']
// also doesn't work
// 'fill-color': ['match', ['string', ['get', 'state']], statesAndColors, '#AAAAAA']
// below example works
// 'fill-color': ['match', ['string', ['get', 'state']], 'New York', '#F0F', 'Pennsylvania', '#FF0', '#AAAAAA']
}
});
mapbox expression match 文档指出您可以使用 'an array of literal values, whose values must be all strings or all numbers (e.g. [100, 101] or ["c", "b"]). The input matches if any of the values in the array matches, similar to the deprecated "in" operator.'
但是我上面的例子并没有像我预期的那样工作。如何格式化表达式以将这些样式作为数组读取? (注意:这个示例应用程序可以很好地使用直接匹配,因为纽约和宾夕法尼亚的值是硬编码的,但我的实际应用程序有动态上传的多边形,所以它们在运行时是未知的。)
您的问题只是 Javascript 语法问题。 statesAndColors
是一个数组,而您需要传入数组的各个值。您可以使用扩展运算符 (...
) 来做到这一点。
所以,改变这个:
'fill-color': ['match', ['string', ['get', 'state']], statesAndColors, '#AAAAAA']
对此:
'fill-color': ['match', ['string', ['get', 'state']], ...statesAndColors, '#AAAAAA']
(来源:我实际上在您引用的文档中写下了这句话 :))