หากคุณต้องการใช้สัญลักษณ์เท่านั้นฉันเสนอวิธีการแก้ปัญหาที่ได้แรงบันดาลใจจากคำตอบของคำถามที่คล้ายกัน: สร้างไฟเซกเตอร์ใน QGIS? .
ทำตามวิธีการที่คล้ายกันและสมมติว่าคุณกำลังทำงานกับProjected CRS (แทนหากคุณใช้ระบบพิกัดทางภูมิศาสตร์ให้ดูบันทึกท้ายคำตอบ) ฉันต้องการขีดเส้นใต้ว่าฉันจะเน้นความสนใจไปที่คำอธิบาย สิ่งเล็กน้อยที่ต้องทำเพื่อให้ได้ผลลัพธ์ที่ต้องการ: นั่นหมายความว่าคุณควรปรับพารามิเตอร์ย่อยอื่น ๆ (เช่นขนาดความกว้างและอื่น ๆ ) อย่างง่ายดายเพื่อให้เหมาะสมกับความต้องการของคุณมากขึ้น
ยิ่งไปกว่านั้นฉันคิดว่านั่น"AZIMUTH"
คือสนามที่เก็บค่าแอซิมัทและ"BEAMWIDTH"
เป็นสนามที่เก็บความกว้างของเสาอากาศ
วิธีการแก้
เราจะแสดงจุดด้วยSingle symbol
และโดยซ้ำกับเลเยอร์สัญลักษณ์หนึ่งSimple Marker
และสองGeometry generator
:
ในคำอธิบายเพิ่มเติมฉันจะทำตามลำดับเดียวกันของสัญลักษณ์ในภาพด้านบน
1) เครื่องหมายง่าย
ฉันเลือกสัญลักษณ์เริ่มต้นของวงกลมสีแดง (นี่เป็นส่วนที่ง่ายกว่าของบทช่วยสอนนี้) มีขนาด 3 มม. และกว้าง 0.4 มม.
2) เครื่องกำเนิดเรขาคณิตที่ 1
เพิ่มเลเยอร์สัญลักษณ์ใหม่และเลือกGeometry generator
และLineString / MultiLineString
ประเภท:
แทรกนิพจน์นี้ในExpression
ฟิลด์:
make_line(
$geometry,
make_point($x + 300*cos(radians(90 - "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)
เราเพิ่งกำหนดลูกศรที่ชี้ไปยังชุด azimuth (สำหรับการสร้างลูกศรอย่าลืมเลือกArrow
ประเภทเลเยอร์สัญลักษณ์ภายใต้Line
ตัวเลือกจากเมนูสัญลักษณ์หลัก) โปรดทราบว่า300
หมายถึงระยะทางเป็นเมตรและเป็นค่าโดยพลการดังนั้นคุณสามารถเปลี่ยนแปลงได้ตามความต้องการของคุณ
3) ตัวสร้างรูปทรงเรขาคณิตหมายเลข 2
เพิ่มเลเยอร์สัญลักษณ์ใหม่และเลือกGeometry generator
ประเภทและPolygon / MultiPolygon
ประเภท:
แทรกนิพจน์นี้ในExpression
ฟิลด์:
CASE
WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
buffer(
$geometry, 200),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" )), $y + 2000*sin(radians((90 - "AZIMUTH" )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
$geometry)
)
)
)
)
WHEN ("BEAMWIDTH") > 180
THEN
difference(
buffer(
$geometry, 200),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
make_point($x - 2000*cos(radians(90 - "AZIMUTH" )), $y - 2000*sin(radians((90 - "AZIMUTH" )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
$geometry)
)
)
)
)
END
เราเพิ่งจะนิยามภาค โปรดทราบว่า200
และ2000
แสดงระยะทางเป็นเมตรและเป็นค่าโดยพลการเนื่องจากฉันพยายามสร้างรูปหลายเหลี่ยมเพื่อตัดกับวงกลมที่มีรัศมี 200 เมตรดังนั้นอย่าลังเลที่จะเปลี่ยนมันตามความต้องการของคุณ
ผลสุดท้าย
หากคุณทำภารกิจก่อนหน้าอย่างถูกต้องคุณควรได้รับผลลัพธ์เช่นงานเหล่านี้ (ป้ายกำกับจะถูกเพิ่มนอกเหนือจากโซลูชันนี้และควรอธิบายบริบทให้ดีขึ้นเท่านั้น):
บันทึก
หากคุณกำลังใช้ระบบพิกัดทางภูมิศาสตร์เช่นถ้าคุณกำลังจัดการกับองศาและไม่ใช่ระยะทางมันควรจะเพียงพอที่จะใช้ค่าที่เหมาะสมเมื่อฉันใช้ระยะทางในสูตรก่อนหน้า ระยะทางที่ฉันใช้คือ:
- 300 ม. (ดูเครื่องกำเนิดเรขาคณิตหมายเลข 1);
- 200 ม. (ดูเครื่องกำเนิดเรขาคณิตหมายเลข 2);
- 2000 ม. (ดูเครื่องกำเนิดเรขาคณิตหมายเลข 2);
ดังนั้นคุณอาจแทนที่ด้วยค่าอื่น ๆ โดยพลการแสดงในองศา (ตัวอย่างเช่น0.0002
, 0.002
และอื่น ๆ )
โบนัส
ฉันแนบสไตล์ไว้ที่นี่ : คุณสามารถเปิดรหัสนี้ด้วยโปรแกรมแก้ไขข้อความและบันทึกเป็นไฟล์ QGIS Layer Style (เช่นมี.qml
นามสกุล)
สไตล์ข้างต้นถูกสร้างขึ้นโดยใช้QGIS 2.18.4 (ต้องมีชื่อเดียวกันกับรูปร่างไฟล์ที่คุณใช้)