EDIT Saya mengedit jawaban untuk mengelola situasi tertentu (karena nilai sudut tertentu) dan untuk tidak menampilkan garis putus-putus ketika sudut bundar ditentukan.
Saya mengusulkan solusi dengan hanya berulang pada simbologi dan pelabelan berbasis aturan.
Sebelum memulai, saya ingin menggarisbawahi bahwa saya akan memusatkan perhatian pada penjelasan tentang hal-hal minimal yang harus dilakukan untuk mereproduksi hasil yang diinginkan: ini berarti bahwa beberapa parameter kecil lainnya (seperti ukuran, lebar dan sebagainya) harus mudah disesuaikan oleh Anda untuk lebih menyesuaikan kebutuhan Anda.
Selain itu, solusi ini hanya berfungsi jika Anda menganggap bahwa 0
derajat adalah Utara dan bukan Selatan (jika 0
Selatan, sebaliknya, itu akan cukup menjumlahkan suatu180
nilai setiap kali muncul '90' dalam rumus yang berhubungan dengan sudut, misalnya cos(radians(90))
akan menjadi cos(radians(180 + 90))
). Saya lebih suka melakukan ini hanya demi memberikan solusi yang lebih umum.
Styling
Kami akan memberikan poin dengan a Single symbol
dan dengan berulang ke satu Simple Marker
dan tiga Geometry generator
lapisan simbol:
Dalam penjelasan lebih lanjut, saya akan mengikuti urutan simbol yang sama pada gambar di atas.
1) Penanda Sederhana
Saya memilih simbol default bintang hitam (ini adalah bagian yang lebih mudah dari tutorial ini), memiliki ukuran 3 mm dan lebar 0,4 mm.
2) Generator Geometri No. 1
Tambahkan layer simbol baru dan pilih Geometry generator
jenisnya:
Masukkan ungkapan ini di Expression
bidang:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "ALKUKULMA")),
$y + 1000*sin(radians(90 - "ALKUKULMA"))
)
)
END
Kami baru saja mendefinisikan garis pertama yang menunjuk ke titik di mana sektor cahaya dimulai. Garis ini panjangnya 1000 m dan dibuat hanya jika sudut pembukaan lampu sektor bukan sudut bundar (ini terjadi untuk menghindari bahwa garis akan memecah seluruh lingkaran).
3) Generator Geometri No. 2
Sama seperti di atas tetapi, pada langkah ini, Anda perlu menggunakan ungkapan ini:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "LOPPUKULMA")),
$y + 1000*sin(radians(90 - "LOPPUKULMA"))
)
)
END
Kami baru saja mendefinisikan garis pertama yang menunjuk ke titik di mana sektor ringan berakhir. Garis ini panjangnya 1000 m dan dibuat hanya jika sudut pembukaan lampu sektor bukan sudut bundar (ini terjadi untuk menghindari bahwa garis akan memecah seluruh lingkaran).
4) Generator Geometri No. 3
Masukkan ungkapan ini di Expression
bidang:
CASE
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
END
Kami baru saja mendefinisikan busur antara titik awal dan akhir dari sektor ringan (harap dicatat bahwa 2000
ini adalah nilai arbitrer karena saya mencoba membuat poligon untuk memotong dengan batas lingkaran yang memiliki jari-jari 900 m).
Selanjutnya, kita perlu mengatur warna yang disimpan di "VARIS"
lapangan. Untuk melakukan ini, kita perlu menentukannya dengan ekspresi khusus. Ikuti panah pada gambar di bawah ini:
dan kemudian ketik ungkapan ini setelah mengklik Edit...
tombol:
CASE
WHEN "VARIS" = 'vi' THEN color_rgb(51,160,44)
WHEN "VARIS" = 'v' THEN color_rgb(255,255,255)
WHEN "VARIS" = 'p' THEN color_rgb(227,26,28)
END
Harap perhatikan bahwa, untuk lapisan simbol ini, saya membuat dua baris: garis atas menentukan warna yang akan digunakan (sebenarnya saya mengatur ekspresi khusus untuk yang satu ini), sedangkan yang lebih rendah berguna untuk menentukan batas hitam (akan memiliki lebar yang lebih besar dari pada garis atas). Ingat juga untuk mengatur Flat
sebagai Cap style
untuk kedua baris untuk menghindari warna yang tumpang tindih.
Pelabelan
1) Mengatur label
Pergi ke Layer Properties
> Labels
dan, seperti biasa, ikuti panah merah:
lalu ketikkan ungkapan ini:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
Kami baru saja menetapkan aturan warna menggunakan nilai yang disimpan di "VARIS"
bidang.
2) Mengatur penempatan untuk label
Pilih Placement
opsi di Labels
Menu dan pilih Offset from point
.
Kemudian, dengan mengacu pada gambar di bawah ini:
ikuti panah merah dan ketik ungkapan ini:
CASE
WHEN "ALKUKULMA" > "LOPPUKULMA"
THEN
concat(
-1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
WHEN "ALKUKULMA" <= "LOPPUKULMA"
THEN
concat(
1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
-1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
END
Kemudian, ikuti panah hijau dan ketikkan ungkapan ini:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Hasil akhir
Jika Anda melakukan tugas-tugas sebelumnya dengan benar, Anda seharusnya bisa mendapatkan hasil ini:
Bonus
Karena parameter minor terlalu banyak untuk sepenuhnya tercakup dalam jawaban ini, saya telah melampirkan gaya di sini : Anda dapat membuka kode ini dengan editor teks apa pun dan menyimpannya sebagai file QGIS Layer Style (yaitu dengan .qml
ekstensi).
Gaya di atas dibuat menggunakan QGIS 2.18.4 (harus memiliki nama yang sama dengan shapefile yang Anda gunakan).