I use a GeoJSON as my source, where every entity has a state. I want to draw circles for every entity, where the circle color is based on the state, and whether the circle has been clicked or not.
Determining the “clicked-state” is done via setFeatureState() where a feature receives the “click” state when clicked.
I tried to first check for the click state and match the state, based on the feature being clicked or not:
"circle-color": [
'case',
['boolean',
['feature-state', 'click'],
false,
],
['match', //Feature clicked = true
['get', 'state'],
'SOME_FEATURE_STATE_STRING',
'#57E757', // possible match
'SOME_OTHER_FEATURE_STATE_STRING',
'#123456', // possible match
'#123456' //fallback
],
'#001ebe' //Feature clicked = false
]
The “unclicked” circle has the correct color. However, when I click the circle, the circle-color is changed to black and not my “match” color.
Any advice is greatly appreciated!
Advertisement
Answer
I think your case expression is incorrect here :
['boolean', ['feature-state', 'click'], false, ],
You have used the boolean types expression, which is a type expression (it asserts that the input value is a boolean).
In your case, you want to use a decision expression.
With the == operator, you can return true if the input values are equal, false otherwise.
Your case expression would become :
"circle-color": [ 'case', ['==', ['feature-state', 'click'], true], ['match', // Feature clicked = true ['get', 'state'], 'SOME_FEATURE_STATE_STRING', '#57E757', // Possible match 'SOME_OTHER_FEATURE_STATE_STRING', '#123456', // Possible match '#123456' // Fallback ], '#001ebe' // Feature clicked = false ]