在QGIS Geometry生成器符号层类型表达式中使用某些“临时变量”?


10

通过使用Geometry generator符号图层类型,我在尺寸@nv_bg_w(宽度)和@nv_bg_h(高度)(项目变量)的矩形上绘制线要素,可以在坐标text_x, text_y(属性,如果不是NULL)处,也可以在线的中心处,使用以下表达式:

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

可以看到x(point_on_surface($geometry))并且y(point_on_surface($geometry))经常发生。至少在这个简单的示例中,这使代码比原来更难阅读。

所以我的问题是:有没有一种方法可以将后一个表达式存储在一些临时变量中,例如(伪代码):

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

Jochen,您找到问题中所描述问题的任何解决方案了吗?我正面临类似的需求,并且正在寻找相同的东西
iulian

Answers:


4

是的,QGIS 3.x中有一种方法。您可以通过with_variable()表达式中的函数设置变量。因此,我希望下面的表达式对您有用。

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

表达式对话框窗口中的文档:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.