-
-
Notifications
You must be signed in to change notification settings - Fork 369
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow expressions in LABEL PRIORITY #6884
Allow expressions in LABEL PRIORITY #6884
Conversation
LGTM
I believe this is just to avoid memory leaks if the PRIORITY keyword would appear several times in the same LABEL object. |
Thanks @rouault for the review and clarification on the above - most appreciated. |
Just for reference @rouault is correct that the following block is used to clean-up any duplicate PRIORITY in a label:
In the case of a Mapfile containing two PRIORITY keywords the first is ignored (and cleaned-up with the above code), and the second expression is used by the label. I added this as part of the msautotest.
|
This pull request allows the new functionality in #6884 of using an expression in a LABEL PRIORITY in MapScript. It takes a similar approach to setting attribute bindings for properties, which requires using the appropriate attribute constant such as `MS_LABEL_BINDING_PRIORITY`: ```python label = mapscript.labelObj() label .setExpressionBinding(mapscript.MS_LABEL_BINDING_PRIORITY, "[MY_ATTRIBUTE] * 2") ``` This is a little clunky but is at least consistent with setting attribute bindings: ```python label = mapscript.labelObj() label.setBinding(mapscript.MS_LABEL_BINDING_COLOR, "NEW_BINDING") ``` While testing this I noticed that the `writeLabel` function used to write Mapfile objects ignored expressions. This seems an oversight also for the `LABEL` `SIZE` expression. If this approach seems appropriate I can use this for other expression bindings. Something to note is that a property could have an attribute binding **and** an expression binding set. In this case the attribute binding currently takes precedence when calculating a shape value, so it also takes precedence when writing to a Mapfile. In theory setting an expression could also set the attribute binding to NULL. This is not currently the case for MapScript or when reading a Mapfile twice.
…Server#6904) This pull request allows the new functionality in MapServer#6884 of using an expression in a LABEL PRIORITY in MapScript. It takes a similar approach to setting attribute bindings for properties, which requires using the appropriate attribute constant such as `MS_LABEL_BINDING_PRIORITY`: ```python label = mapscript.labelObj() label .setExpressionBinding(mapscript.MS_LABEL_BINDING_PRIORITY, "[MY_ATTRIBUTE] * 2") ``` This is a little clunky but is at least consistent with setting attribute bindings: ```python label = mapscript.labelObj() label.setBinding(mapscript.MS_LABEL_BINDING_COLOR, "NEW_BINDING") ``` While testing this I noticed that the `writeLabel` function used to write Mapfile objects ignored expressions. This seems an oversight also for the `LABEL` `SIZE` expression. If this approach seems appropriate I can use this for other expression bindings. Something to note is that a property could have an attribute binding **and** an expression binding set. In this case the attribute binding currently takes precedence when calculating a shape value, so it also takes precedence when writing to a Mapfile. In theory setting an expression could also set the attribute binding to NULL. This is not currently the case for MapScript or when reading a Mapfile twice.
This allows expressions to be added to a LABEL PRIORITY As well as attribute bindings and integer values.
This is useful to allow labels to be prioritised on attributes dynamically e.g. calculate a 1-10 value based on population sizes of cities (by calculating a percentage of the highest value).
The code is based on the SLD pull request from @jbo-ads.
There are also comments from @sdlime on the pull request about using this as a template pull request to allow expressions for other Mapfile values.
Tests have been added for each of the 3 ways of setting a label priority - numeric value, attribute binding, and the new expression option.
Code reviews would be appreciated. I'm unsure why the following block is required (the SIZE pull request included this). Is it to clean-up expressions if a Mapfile is read a second time?
Docs to be updated if merged.