Використання деяких "тимчасових змінних" у виразі типу символу рівня генератора QGIS Геометрії?


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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.