Vous utilisez des «variables temporaires» dans l'expression de type de couche de symboles du générateur QGIS Geometry?

10

En utilisant le Geometry generatortype de couche de symboles, je dessine des rectangles de dimensions @nv_bg_w(largeur) et @nv_bg_h(hauteur) (variables de projet) pour aligner des entités, soit aux coordonnées text_x, text_y(attributs, sinon NULL) soit alternativement au centre de la ligne par l'expression suivante:

geom_from_wkt(
    'POLYGON((' ||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  COALESCE("text_y", y(point_on_surface($geometry))) || ','||
    (to_real(COALESCE("text_x", x(point_on_surface($geometry)))+ @nv_bg_w )) ||' '||  COALESCE("text_y", y(point_on_surface($geometry))) || ','||
    (to_real(COALESCE("text_x", x(point_on_surface($geometry)))+ @nv_bg_w  )) ||' '||  (to_real(COALESCE("text_y", y(point_on_surface($geometry))))- @nv_bg_h ) || ','||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  (to_real(COALESCE("text_y", y(point_on_surface($geometry))))- @nv_bg_h ) || ','||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  COALESCE("text_y", y(point_on_surface($geometry)))|| '))'
)

Comme on peut le voir x(point_on_surface($geometry))et y(point_on_surface($geometry))se produire très souvent. Au moins dans cet exemple simple, cela rend le code plus difficile à lire qu'il ne le devrait.

Ma question est donc la suivante: existe-t-il un moyen de stocker ces dernières expressions dans certaines variables temporaires, quelque chose comme (pseudocode):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on
Jochen Schwarze
la source
Jochen, avez-vous trouvé une solution au problème décrit dans votre question? Je suis confronté à un besoin similaire et je cherche la même chose
iulian

Réponses:

4

Oui, il existe un moyen dans QGIS 3.x. Vous pouvez définir une variable au moyen d'une with_variable()fonction dans une expression. J'espère donc que l'expression ci-dessous fonctionnera pour vous.

with_variable( 'mx', x(point_on_surface($geometry)),
    with_variable( 'my', y(point_on_surface($geometry)),
        geom_from_wkt(
            'POLYGON((' ||
            COALESCE("text_x", @mx) ||' '||  COALESCE("text_y", @my) || ','||
            (to_real(COALESCE("text_x", @mx)+ @nv_bg_w )) ||' '||  COALESCE("text_y", @my) || ','||
            (to_real(COALESCE("text_x", @mx)+ @nv_bg_w  )) ||' '||  (to_real(COALESCE("text_y", @my))- @nv_bg_h ) || ','||
            COALESCE("text_x", @mx) ||' '||  (to_real(COALESCE("text_y", @my))- @nv_bg_h ) || ','||
            COALESCE("text_x", @mx) ||' '||  COALESCE("text_y", @my)|| '))'
        )
    )
)

Documentation dans la fenêtre de dialogue d'expression:

entrez la description de l'image ici

Kadir Şahbaz
la source