Использование некоторых «временных переменных» в выражении типа слоя символов генератора 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
Йохен Шварце
источник
Йохен, вы нашли решение проблемы, описанной в вашем вопросе? Я сталкиваюсь с аналогичной потребностью и ищу то же самое
Юлиан

Ответы:

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

Документация в диалоговом окне выражения:

введите описание изображения здесь

Кадир Шахбаз
источник