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, 180
açı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 symbol
ve bir Simple Marker
ve üç Geometry generator
sembol 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 generator
türü seçin :
Bu ifadeyi Expression
alana 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 Expression
alana 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 2000
keyfi 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 Flat
olarak Cap style
örtüşen herhangi bir rengi kaçınmak için her iki hatları için.
etiketleme
1) Etiketleri ayarlama
Git Layer Properties
> Labels
ve 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 Placement
seçeneği seçin Labels
ve 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 .qml
uzantı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).