EDIT Belirli durumları yönetmek (belirli açı değerleri nedeniyle) ve yuvarlak bir açı tanımlandığında noktalı çizgileri görüntülememek için cevabı değiştirdim.
Sadece kurala dayalı semboloji ve etiketleme ile tekrar ederek bir çözüm öneriyorum.
Başlamadan önce, istenen sonucu elde etmek için yapılacak en az şeyin açıklanmasına odaklanacağımın altını çizmek istiyorum: bu, diğer bazı küçük parametrelerin (boyutlar, genişlikler vb.) Sizin tarafınızdan kolayca ayarlanabilmesi gerektiği anlamına gelir. ihtiyaçlarınızı daha iyi karşılamak için.
Ayrıca, bu çözüm yalnızca0 derecenin Güney yerine Kuzey olduğunu varsayarsanız çalışır (Güney ise 0, bunun yerine, 180açılarla ilgilenen formüllerde her zaman '90' görünen bir değer toplamak yeterli cos(radians(90))olacaktır cos(radians(180 + 90))). Bunu daha genel bir çözüm vermek adına yapmayı tercih ettim.
Şekillendirme
Noktaları a ile işaretleyeceğiz Single symbolve bir Simple Markerve üç Geometry generatorsembol katmanına tekrarlayarak :

Daha fazla açıklamada, yukarıdaki resimdeki sembollerin aynı sırasını izleyeceğim.
1) Basit Marker
3 mm büyüklüğüne ve 0,4 mm genişliğe sahip siyah bir yıldızın varsayılan sembolünü seçtim (bu, bu eğitimin kolay kısmıdır).
2) Geometri Jeneratör No. 1
Yeni bir sembol katmanı ekleyin ve aşağıdaki Geometry generatortürü seçin :

Bu ifadeyi Expressionalana ekleyin :
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
Işık sektörünün başladığı noktaya işaret eden ilk çizgiyi henüz tanımladık. Bu çizgi 1000 m uzunluğundadır ve yalnızca sektör ışığının açılma açısı yuvarlak bir açı olmadığında oluşturulur (bu, çizginin tüm daireyi kırmasını önlemek için olur).
3) Geometri Jeneratör No. 2
Yukarıdakiyle aynı, ancak bu adımda, bu ifadeyi kullanmanız gerekir:
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
Işık sektörünün son bulduğu noktaya işaret eden ilk çizgiyi henüz tanımladık. Bu çizgi 1000 m uzunluğundadır ve yalnızca sektör ışığının açılma açısı yuvarlak bir açı olmadığında oluşturulur (bu, çizginin tüm daireyi kırmasını önlemek için olur).
4) Geometri Jeneratör No. 3
Bu ifadeyi Expressionalana ekleyin :
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
Işık sektörünün başlangıç ve bitiş noktaları arasındaki arkı az önce tanımladık (lütfen 2000keyfi bir değer olduğunu unutmayın, çünkü 900 m yarıçapı olan dairenin sınırlarıyla kesişecek bir çokgen oluşturmaya çalışıyorum ).
Ayrıca, "VARIS"alanda depolanan rengi de ayarlamamız gerekir . Bunu yapmak için, bunu özel bir ifade ile belirtmemiz gerekir. Aşağıdaki resimdeki oku izleyin:

ve daha sonra Edit...düğmeyi tıkladıktan sonra bu ifadeyi yazın :
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
Lütfen, bu sembol katmanı için iki satır oluşturduğumu unutmayın: üst satır kullanılacak rengi tanımlar (aslında bunun için özel ifadeyi ayarlarım), alt satır ise siyah kenarlık tanımlamak için yararlı olur ( üst çizgiden daha büyük olan bir genişlik). Ayarlamak için de hatırla Flatolarak Cap styleörtüşen herhangi bir rengi kaçınmak için her iki hatları için.
etiketleme
1) Etiketleri ayarlama
Git Layer Properties> Labelsve her zamanki gibi kırmızı okları izleyin:

ve sonra bu ifadeyi yazın:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
"VARIS"Alanda depolanan değeri kullanarak renk kuralını henüz tanımladık .
2) Etiketler için yerleşimin ayarlanması
Menüden Placementseçeneği seçin Labelsve seçin Offset from point.
Ardından, aşağıdaki resme referansla:

kırmızı oku takip edin ve şu ifadeyi yazın:
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
Ardından yeşil oku izleyin ve şu ifadeyi yazın:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Son sonuç
Önceki görevleri doğru bir şekilde gerçekleştirdiyseniz, bu sonucu elde edebilmeniz gerekir:

Bonus
Küçük parametreler bu cevap içinde tamamen kaplanamayacak kadar çok olduğundan, buradaki stili ekledim : bu kodu herhangi bir metin düzenleyicide açıp QGIS Katman Stili dosyası (örneğin bir .qmluzantıyla) olarak kaydedebilirsiniz .
Yukarıdaki stil, QGIS 2.18.4 kullanılarak oluşturulmuştur (kullandığınız şekil dosyasının adıyla aynı olmalıdır).