แก้ไขฉันแก้ไขคำตอบสำหรับการจัดการสถานการณ์เฉพาะ (เนื่องจากค่ามุมที่เฉพาะเจาะจง) และไม่แสดงเส้นประเมื่อมีการกำหนดมุมมน
ฉันเสนอวิธีแก้ปัญหาโดยการทำซ้ำตามสัญลักษณ์และการติดฉลากตามกฎเท่านั้น
ก่อนที่จะเริ่มฉันต้องการขีดเส้นใต้ที่ฉันจะมุ่งเน้นความสนใจไปที่คำอธิบายของสิ่งเล็ก ๆ น้อย ๆ ที่จะทำเพื่อให้ได้ผลลัพธ์ที่ต้องการ: นั่นหมายความว่าคุณควรปรับพารามิเตอร์ย่อยอื่น ๆ (เช่นขนาดความกว้างเป็นต้น) เพื่อให้เหมาะกับความต้องการของคุณ
นอกจากนี้วิธีนี้จะใช้งานได้ก็ต่อเมื่อคุณคิดว่า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
เราเพิ่งกำหนดบรรทัดแรกซึ่งชี้ไปยังจุดที่ภาคแสงเริ่มต้น บรรทัดนี้มีความยาว 1,000 ม. และสร้างขึ้นเฉพาะเมื่อมุมเปิดของแสงเซกเตอร์ไม่ใช่มุมกลม (เกิดขึ้นเพื่อหลีกเลี่ยงว่าเส้นจะแตกเป็นวงกลมทั้งหมด)
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
เราเพิ่งกำหนดบรรทัดแรกซึ่งชี้ไปยังจุดที่ภาคแสงสิ้นสุด บรรทัดนี้มีความยาว 1,000 ม. และสร้างขึ้นเฉพาะเมื่อมุมเปิดของแสงเซกเตอร์ไม่ใช่มุมกลม (เกิดขึ้นเพื่อหลีกเลี่ยงว่าเส้นจะแตกเป็นวงกลมทั้งหมด)
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 Layer Style (เช่นมี.qml
ส่วนขยาย)
สไตล์ข้างต้นถูกสร้างขึ้นโดยใช้QGIS 2.18.4 (ต้องมีชื่อเดียวกันกับรูปร่างไฟล์ที่คุณใช้)