Fungsi agregat dalam QGIS dirancang untuk bekerja dengan 2 layer vektor input yang terpisah, tetapi kita juga dapat membuatnya bekerja dengan satu layer. Pada dasarnya melakukan query spasial untuk obyek di dalam layer.
Contoh kasus adalah sebagai berikut. Dalam layer yang berisi kode pos, kita ingin menemukan semua kode pos tetangga untuk setiap poligon yang ada. Ini dapat dilakukan dengan sangat mudah dengan membuat field baru dengan ekspresi dengan fungsi agregat – menggunakan layer itu sendiri sebagai layer induk.
Di bawah ini adalah shp kode Zip dari Portal Data Terbuka Kota Seattle. Tugas kita adalah menambahkan kolom yang berisi semua kode pos yang berdekatan untuk setiap obyek yang ada. Perhatikan nama layernya adalah Zip_Codes.
Buka Tabel Atribut untuk layer. Perhatikan nama kolom yang berisi kode pos 5 digit adalah ZIPCODE. Buka Field Calculator.
Buat field baru dengan ekspresi berikut. Kuncinya di sini adalah filter spasial intersects($geometry, geometry(@parent)) yang menemukan semua poligon dari layer yang memotong obyek yang sedang diproses.
aggregate(
layer:=
'Zip_Codes'
,
aggregate:=
'concatenate'
,
expression:=ZIPCODE,
concatenator:=
', '
,
filter:=intersects($geometry, geometry(@parent))
)
Catatan: Jika Anda tidak mendapatkan hasil yang akurat, coba yang berikut ini
- Tambahkan buffer ke geometri. Ubah pernyataan filter menjadi sesuatu seperti filter:=intersects($geometry, buffer(geometry(@parent), 1)) di mana 1 adalah jarak dalam unit CRS layer Anda. Ubah nomor yang sesuai untuk unit CRS Anda.
- Alih-alih melakukan agregate menggunakan layer yang sama, duplikasi layer dengan mengklik kanan layer dan memilih ‘Duplicate’. Dan ketika menjalankan fungsi agregat, gunakan nama layer duplikat bukan layer asli.
Anda sekarang akan memiliki kolom baru yang memiliki kode pos terdekat untuk setiap obyek di layer!
Agregat concatenate/gabungan mengharuskan string sebagai input, jadi jika kolom yang Anda coba agregat bukan string, Anda akan mendapatkan pesan kesalahan. Untuk menggunakan kolom integer dengan concatenate/gabungan, Anda harus terlebih dahulu mengubahnya menjadi string menggunakan fungsi konversi bawaan to_string (). Jika kolom ZIPCODE bertipe integer, Anda dapat menggunakannya sebagai berikut
aggregate(
layer:=
'Zip_Codes'
,
aggregate:=
'concatenate'
,
expression:=to_string(
"ZIPCODE"
),
concatenator:=
', '
,
filter:=intersects($geometry, geometry(@parent))
)
Ada banyak jenis agregat yang bisa Anda gunakan. Jika Anda ingin menghitung penomoran kode pos, Anda dapat menggunakan jumlah agregat (count agregate) alih-alih gabungan, syntax berikut akan menghitung jumlah poligon terdekat.
aggregate(
layer:=
'Zip_Codes'
,
aggregate:=
'count'
,
expression:=$id,
filter:=touches($geometry, geometry(@parent))
)