Usando algumas 'variáveis ​​temporárias' na expressão do tipo de camada de símbolo do gerador de geometria QGIS?

10

Utilizando o Geometry generatortipo de camada de símbolo, desenho retângulos de dimensões @nv_bg_w(largura) e @nv_bg_h(altura) (variáveis ​​do projeto) para os recursos da linha, seja nas coordenadas text_x, text_y(atributos, se não estiverem NULL) ou, alternativamente, no centro da linha pela seguinte expressão:

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)))|| '))'
)

Como pode ser visto x(point_on_surface($geometry))e y(point_on_surface($geometry))ocorre com muita frequência. Pelo menos neste exemplo simples, isso torna o código mais difícil de ler do que deveria.

Então, minha pergunta é: Existe uma maneira de armazenar as últimas expressões em algumas variáveis ​​temporárias, algo como (pseudocódigo):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on
Jochen Schwarze
fonte
Jochen, você encontrou alguma solução para o problema descrito na sua pergunta? Eu estou enfrentando uma necessidade semelhante e estou procurando a mesma coisa
iulian

Respostas:

4

Sim, existe uma maneira no QGIS 3.x. Você pode definir uma variável por meio da with_variable()função dentro de uma expressão. Então, espero que a expressão abaixo funcione para você.

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)|| '))'
        )
    )
)

Documentação na janela de diálogo de expressão:

insira a descrição da imagem aqui

Kadir Şahbaz
fonte