In QGIS Graphical modeller there is the option to create user defined variables that one can use in the model. I dont always need to use the modeller to do stuff. Is there a way to have user defined variables in regular QGIS (very good for styling)?
I have found that in model properties I can use Title, Abstract, Author etc. for this, but that is really not very elegant. I just want regular variables that I can set and then use. Really good for visualization works.
1 Answer 1
Yes, you can define your own custom variables in QGIS in different levels like as in global Level, as project or layer variables and even as ad hoc variables in QGIS expressions using the function with_variable()
.
See functions help for with_variable()
expression as well as an expample where three different variable are declared: vertex
(=20), azimuth1
and azimuth2
(the last two have an expression assigned as values).
Go to the Settings / properties of the desired Level (e.g. right Click layer > properties > tab variables
) and select variables to add your own variable by typing a name and the value of the variable. You can then call the variable by its Name preceded with @
- e.g. @my_variable
.
See here for more information about custom variables: http://nyalldawson.net/2015/12/exploring-variables-in-qgis-pt-3-layer-level-variables/
The content (value) of the varible can be set to an attribute or a complex expression e.g. to generate all kind of sophisticated data defined styles. So this example: define a project variable called set_color
with this value (string):
case
when value = 1 then 'red'
when value = 2 then 'blue'
when value = 3 then 'green'
else 'yellow'
end
Now use the variable @set_color
to create a data defined color of a layer, based on its attribute field value
using the function eval()
: eval(@set_color)
:
Variables you defined at global, project or layer level will appear in expression string builder dialog under variables
:
-
Very cool, thank you so much. I always thought it was something else, now it makes complete sense. Two more questions then. 1. is there a way to have some of the variable on my interface as a panel or toolbar for quick access? 2. is there a way to assign an attribute to a variable? I often make complicated styling settings that include attributes of the layer and it is a pain to change all of them individually, if I could change them globally through a variable it would be a life saver. But I am afraid it only works with one value, right? Thanks.Roman Dostál– Roman Dostál2022年09月17日 13:19:22 +00:00Commented Sep 17, 2022 at 13:19
-
1. I'm not sure what you mean by "have some of the variable on my interface as a panel or toolbar for quick access" - if you have another question, best post it as a separate post. 2. You can't only assign an attribute to a variable, but a whole expression, see updated answer.Babel– Babel2022年09月17日 13:38:01 +00:00Commented Sep 17, 2022 at 13:38
-
Added another edit at the bottom of my answer, maybe this is what you looked for...?Babel– Babel2022年09月17日 13:49:28 +00:00Commented Sep 17, 2022 at 13:49
-
Lets forget n. 1 for now. Thank you for your edit. However, I am afraid it doesn't achieve much for me. I could just as well add this expression directly and not through the variable, even though its quite cool. What I am looking for is to quickly change part of this expression using variables. Lets use your example - what if I wanted to not use "value" but instead wanted to use a different attribute ("value2"), how do I set it up, so that I can change it in multiple styling options? Can this be achieved through variables? Example of expression of mine: imgur.com/a/8LobxXZRoman Dostál– Roman Dostál2022年09月17日 13:59:06 +00:00Commented Sep 17, 2022 at 13:59
-
Simply go where you defined the variable and change from
value
tovalue2
and wherever you used this custom variable, settings will use fieldvalue2
and notvalue
any more. This works even for many different layers at once as long as all of them have a fieldvalue2
(orvalue
).Babel– Babel2022年09月17日 14:12:34 +00:00Commented Sep 17, 2022 at 14:12