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, 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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.