EDIT I ने विशेष स्थितियों (विशिष्ट कोण मानों के कारण) के प्रबंधन के लिए और एक गोल कोण परिभाषित होने पर बिंदीदार रेखाओं को प्रदर्शित नहीं करने के लिए उत्तर संपादित किया।
मैं केवल नियम-आधारित सिम्बॉलॉजी और लेबलिंग के आवर्ती द्वारा एक समाधान का प्रस्ताव करता हूं।
शुरू करने से पहले, मैं यह रेखांकित करना चाहता हूं कि मैं वांछित परिणाम को पुन: पेश करने के लिए न्यूनतम चीजों की व्याख्या पर ध्यान केंद्रित करूंगा: इसका मतलब है कि कुछ अन्य मामूली पैरामीटर (जैसे आकार, चौड़ाई और इतने पर) आसानी से आपके द्वारा समायोजित किए जाने चाहिए। अपनी आवश्यकताओं के लिए बेहतर फिटिंग के लिए।
इसके अलावा, यह समाधान केवल तभी काम करता है जब आप यह मान लेते हैं कि 0
डिग्री दक्षिण के बजाय उत्तर है (यदि 0
दक्षिण है, इसके बजाय, यह 180
हर बार एक मान को पर्याप्त करेगा जो कि '90' के फॉर्मूले में दिखाई देता है जो कोणों के साथ व्यवहार करते हैं, जैसे cos(radians(90))
बन जाएगा cos(radians(180 + 90))
)। मैंने केवल अधिक सामान्य समाधान देने के लिए ऐसा करना पसंद किया।
स्टाइलिंग
हम Single symbol
एक Simple Marker
और तीन Geometry generator
प्रतीक परतों के आवर्ती के साथ अंक प्रस्तुत करेंगे :
आगे की व्याख्या में, मैं ऊपर की छवि में प्रतीकों के उसी क्रम का पालन करूंगा।
1) सरल मार्कर
मैंने एक ब्लैक स्टार का डिफ़ॉल्ट चिन्ह चुना (यह इस ट्यूटोरियल का सबसे आसान हिस्सा है), जिसका आकार 3 मिमी और चौड़ाई 0.4 मिमी है।
2) ज्यामिति जनरेटर नंबर 1
एक नई प्रतीक परत जोड़ें और Geometry generator
प्रकार चुनें :
इस एक्सप्रेशन को Expression
फ़ील्ड में डालें :
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
हमने केवल पहली पंक्ति को परिभाषित किया है जो उस बिंदु की ओर इंगित करता है जहां प्रकाश क्षेत्र शुरू होता है। यह रेखा 1000 मीटर लंबी है और इसे केवल तभी बनाया जाता है जब सेक्टर प्रकाश का उद्घाटन कोण एक गोल कोण नहीं होता है (यह बचने के लिए होता है कि लाइन एक पूरे वृत्त को तोड़ देगी)।
3) ज्यामिति जनरेटर नंबर 2
ऊपर के समान लेकिन, इस चरण में, आपको इस अभिव्यक्ति का उपयोग करने की आवश्यकता है:
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
हमने केवल पहली पंक्ति को परिभाषित किया है जो उस बिंदु की ओर इंगित करती है जहां प्रकाश क्षेत्र समाप्त होता है। यह रेखा 1000 मीटर लंबी है और इसे केवल तभी बनाया जाता है जब सेक्टर प्रकाश का उद्घाटन कोण एक गोल कोण नहीं होता है (यह बचने के लिए होता है कि लाइन एक पूरे वृत्त को तोड़ देगी)।
4) ज्यामिति जेनरेटर नंबर 3
इस एक्सप्रेशन को Expression
फ़ील्ड में डालें :
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
हमने प्रकाश क्षेत्र के शुरुआती और अंतिम बिंदुओं के बीच चाप को परिभाषित किया है (कृपया ध्यान दें कि 2000
यह एक मनमाना मूल्य है क्योंकि मैं एक बहुभुज बनाने की कोशिश कर रहा हूं, जिसमें 900 मीटर की त्रिज्या वाली सीमा के साथ एक दूसरे को काटना है)।
इसके अलावा, हमें उस रंग को सेट करने की आवश्यकता है जो "VARIS"
फ़ील्ड में संग्रहीत है । ऐसा करने के लिए, हमें इसे एक कस्टम अभिव्यक्ति के साथ निर्दिष्ट करने की आवश्यकता है। नीचे दी गई छवि में तीर का पालन करें:
और फिर Edit...
बटन पर क्लिक करने के बाद इस अभिव्यक्ति को टाइप करें:
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
कृपया ध्यान दें कि, इस प्रतीक परत के लिए, मैंने दो लाइनें बनाईं: ऊपरी रेखा रंग को उपयोग करने के लिए परिभाषित करती है (वास्तव में मैं इस एक के लिए कस्टम अभिव्यक्ति सेट करता हूं), जबकि निचली एक काली सीमा को परिभाषित करने के लिए उपयोगी है (इसमें होगा) एक चौड़ाई जो ऊपरी रेखा से एक से बड़ी है)। किसी भी रंग अतिव्यापी से बचने के लिए दोनों पंक्तियों के Flat
रूप में सेट करने के Cap style
लिए भी याद रखें ।
लेबलिंग
1) लेबल सेट करना
पर जाएं Layer Properties
> Labels
और हमेशा की तरह, लाल तीर का पालन करें:
और फिर यह अभिव्यक्ति टाइप करें:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
हमने केवल "VARIS"
क्षेत्र में संग्रहीत मूल्य का उपयोग करके रंग नियम को परिभाषित किया है ।
2) लेबल के लिए प्लेसमेंट सेट करना
मेनू Placement
में विकल्प चुनें Labels
और चुनें Offset from point
।
फिर, नीचे की छवि के संदर्भ में:
लाल तीर का अनुसरण करें और इस अभिव्यक्ति को टाइप करें:
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
फिर, हरे तीर का अनुसरण करें और इस अभिव्यक्ति को टाइप करें:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
अंतिम परिणाम
यदि आपने पिछले कार्यों को सही ढंग से किया है, तो आपको यह परिणाम प्राप्त करने में सक्षम होना चाहिए:
बोनस
चूंकि इस उत्तर के भीतर पूरी तरह से कवर होने के लिए मामूली पैरामीटर बहुत अधिक थे, इसलिए मैंने यहां शैली संलग्न की है : आप इस कोड को किसी भी टेक्स्ट एडिटर के साथ खोल सकते हैं और इसे QGIS लेयर स्टाइल फाइल के रूप में सहेज सकते हैं (अर्थात .qml
एक्सटेंशन के साथ )।
उपरोक्त शैली QGIS 2.18.4 का उपयोग करके बनाई गई थी (इसमें आपके द्वारा उपयोग किए जाने वाले आकार का नाम समान होना चाहिए)।