¿Usando algunas 'variables temporales' en la expresión de tipo de capa de símbolo del generador de geometría QGIS?

10

Haciendo uso del Geometry generatortipo de capa de símbolo, dibujo rectángulos de dimensiones @nv_bg_w(ancho) y @nv_bg_h(alto) (variables de proyecto) para entidades de línea, ya sea en coordenadas text_x, text_y(atributos, si no NULL) o alternativamente en el centro de la línea mediante la siguiente expresión:

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 puede verse x(point_on_surface($geometry))y y(point_on_surface($geometry))ocurrir muy a menudo. Al menos en este simple ejemplo, esto hace que el código sea más difícil de leer de lo que debería.

Entonces mi pregunta es: ¿Hay alguna forma de almacenar las últimas expresiones en algunas variables temporales, 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
fuente
Jochen, ¿encontraste alguna solución al problema descrito en tu pregunta? Estoy enfrentando una necesidad similar y estoy buscando lo mismo
iulian

Respuestas:

4

Sí, hay una manera en QGIS 3.x. Puede establecer una variable mediante la with_variable()función dentro de una expresión. Así que espero que la expresión a continuación funcione para ti.

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

Documentación en la ventana de diálogo de expresión:

ingrese la descripción de la imagen aquí

Kadir Şahbaz
fuente