我很难在Mapbox/Maplibre GL JS中编写一个样式表达式,以便根据geojson中的值设置圆半径。我有很多功能,它们的属性看起来像这样:
"properties": {
"name": "Site A",
"type": "Bucket Trap",
"data": [
{
"date": "2019-08-26",
"catch": 21,
},
{
"date: "2019-08-27",
"catch": 15
}
}
当用户从表单控件中选择日期时,我希望将圆半径设置为等于该特定日期的捕获值。
我想也许我可以使用的索引来查找具有请求日期的对象,然后从该对象中获取catch值。
我试过以下几种:
let selectedDate = '2019-08-26';
map.setPaintProperty(
'traps',
'circle-radius',
[
'get',
'catch',
[
'at',
[
'index-of',
selectedDate,
[
'get',
'date',
[
'get',
'avgdata'
]
]
],
[
'get',
'avgdata'
]
]
]
);
并在控制台上接收此错误:
期望值的类型为object,但找到的却是array<对象,26>相反
如果你更容易在一行上阅读表达式,下面是我一直在尝试的:
['get', 'catch', ['at', ['index-of', selectedDate, ['get', 'date', ['get', 'avgdata']]], ['get', 'avgdata']]]
提前感谢您的任何建议!
嵌套对象可以通过嵌套表达式和使用"properties"对象来完成:-
{
"description" : {"title" : "foo"}
}
['get', 'title', ['get','description', ['properties']]]
我不确定是否可以用GeoJSON的结构化方式编写您想要的表达式。但由于您控制了GeoJSON,您可以简单地首先对其进行重组,因此它看起来像这样:
{
"properties": {
"name": "Site A",
"type": "Bucket Trap",
"2019-08-26": 21,
"2019-08-27": 15
}
}
现在,您可以访问给定日期的捕获计数,如下所示:
map.setPaintProperty('traps', 'circle-radius', ['get', selectedDate]);