Menggunakan beberapa 'variabel sementara' dalam ekspresi tipe simbol layer simbol generator Geometri QGIS?

10

Memanfaatkan jenis Geometry generatorsimbol layer, saya menggambar segi empat dimensi @nv_bg_w(lebar) dan @nv_bg_h(tinggi) (variabel proyek) ke fitur garis, baik pada koordinat text_x, text_y(atribut, jika tidak NULL) atau sebagai alternatif di tengah garis dengan ekspresi berikut:

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

Seperti dapat dilihat x(point_on_surface($geometry))dan y(point_on_surface($geometry))terjadi sangat sering. Setidaknya dalam contoh sederhana ini, ini membuat kode lebih sulit dibaca daripada yang seharusnya.

Jadi pertanyaan saya adalah: Apakah ada cara untuk menyimpan ekspresi terakhir dalam beberapa variabel sementara, seperti (pseudocode):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on
Jochen Schwarze
sumber
Jochen, apakah Anda menemukan solusi untuk masalah yang dijelaskan dalam pertanyaan Anda? Saya menghadapi kebutuhan yang sama dan sedang mencari hal yang sama
iulian

Jawaban:

4

Ya, ada cara di QGIS 3.x. Anda bisa mengatur variabel dengan with_variable()fungsi dalam ekspresi. Jadi saya berharap ungkapan di bawah ini akan bekerja untuk Anda.

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

Dokumentasi di jendela dialog ekspresi:

masukkan deskripsi gambar di sini

Kadir Şahbaz
sumber