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, 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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.