15 votos

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

Haciendo uso de la Geometry generator tipo de capa de símbolos, dibujo rectángulos de dimensiones @nv_bg_w (anchura) y @nv_bg_h (altura) (variables de proyecto) a características 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)) ocurren muy a menudo. Al menos en este sencillo ejemplo, esto hace que el código sea más difícil de leer de lo que debería.

Así que mi pregunta es: ¿Hay una manera de almacenar las últimas expresiones en algunas variables temporales, algo así como (pseudocódigo):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on

11voto

nitinsavant Puntos 6

Sí, hay una manera en QGIS 3.x. Puede establecer una variable mediante with_variable() dentro de una expresión. Así que espero que la expresión de abajo funcionará para usted.

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:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X