แสดงสัญลักษณ์เสาอากาศบนแผนที่: สัญลักษณ์จุดหรือคุณสมบัติ (รูปหลายเหลี่ยม)


12

ฉันต้องการแสดงเครือข่ายเซลลูล่าร์บนแผนที่ ข้อมูลอินพุตเป็นไฟล์. csv โดยที่แต่ละสตริงเป็นเซกเตอร์เซลลูลาร์ คุณลักษณะคือ: id ภาค, พิกัดของมัน, ราบและมุมของความกว้างของลำแสงเสาอากาศ

ค่าความกว้างของคานเสาอากาศอยู่ในช่วง 30 ถึง 360 องศา ความกว้างของคานเสาอากาศ 360 หมายความว่าจะต้องแสดงบนแผนที่เป็นวงกลม เสาอากาศที่มีความกว้างลำแสงอื่น ๆ จะต้องแสดงเป็นส่วนที่มีมุมรับแสงที่เหมาะสม

ป้อนคำอธิบายรูปภาพที่นี่

เป็นไปได้หรือไม่ที่จะแสดงเสาอากาศโดยใช้สัญลักษณ์เท่านั้น? ฉันรู้วิธีสร้างสัญลักษณ์ SVG ของฉันเองและหวังว่าจะหาวิธีหมุนมันตามราบ แต่มีวิธีใดบ้างที่จะใช้ความกว้างของคานเสาอากาศแปรผันตามค่าคุณลักษณะจาก 30 ถึง 360 องศา

ฉันคิดว่าสัญลักษณ์เป็นวิธีที่ดีที่สุดในการดึงเสาอากาศเนื่องจากการแสดงข้อมูลแบบไดนามิกบนแผนที่ตามขนาดของมุมมองหากวิธีนี้เป็นไปได้ใน QGIS

แน่นอนว่างานสามารถแก้ไขได้โดยการวาดรูปหลายเหลี่ยมที่เหมาะสมเป็นคุณลักษณะเลเยอร์ แต่นั่นจะเป็นวิธีแก้ปัญหา


ดังนั้นคุณต้องวาดส่วนโค้งในทิศทางที่ถูกต้องซึ่งแตกต่างกันในแต่ละไซต์
นาธาน W

ไม่เลยถ้าฉันเข้าใจถูกต้อง จะต้องเป็นภาคของวงกลม (หรือทั้งวงกลมในกรณีที่มีความกว้าง = 360) ตามที่แสดงในภาพ
E Bobrov

ใช่นั่นคือสิ่งที่ฉันหมายถึง
นาธาน W

โอเคฉันเข้าใจแล้ว โดยทั่วไปการพูดสัญลักษณ์อาร์คไม่จำเป็นต้องใช้อย่างเคร่งครัด คุณสมบัติหลักคือราบและลำแสง ฉันสามารถใช้สัญลักษณ์ใด ๆ เพื่อวาดเสาอากาศไม่ใช่ส่วนโค้งเท่านั้น
E Bobrov

อาจจะฉันได้พบตัวอย่างที่อาจช่วยสร้างที่กำหนดเองสัญลักษณ์ประเภทเลเยอร์ แต่ฉันไม่แน่ใจ มีใครพยายามสร้างคลาสเลเยอร์สัญลักษณ์ของคุณเองซึ่งดึงตัวอย่างแต่ละทิศทางของคุณลักษณะเลเยอร์ขึ้นอยู่กับคุณลักษณะของมัน (เช่นเสาอากาศราบในคำของภาพด้านบน)?
E Bobrov

คำตอบ:


7

ไม่กี่วันที่ผ่านมาปลั๊กอินใหม่ที่ถูกเพิ่มเข้ามาใน QGIS เรียก ลิ่มบัฟเฟอร์การประมวลผลขั้นตอนวิธี ดูเหมือนว่าอาจเป็นเรื่องที่น่าสนใจ

ดังที่ชื่อแนะนำว่าเป็นอัลกอริทึมการประมวลผลดังนั้นคุณจะต้องเรียกใช้จากกล่องเครื่องมือการประมวลผล ยังไม่มีโอกาสลองดู

มันสร้างเซกเตอร์ของแวดวง - เหมือนบัฟเฟอร์วงกลมปกติ แต่มุมลิ่มและรัศมีสามารถตั้งค่าได้โดยใช้ค่าฟิลด์

สามารถดูเอกสารและภาพหน้าจอได้ที่หน้า GitHub


10

หากคุณต้องการใช้สัญลักษณ์เท่านั้นฉันเสนอวิธีการแก้ปัญหาที่ได้แรงบันดาลใจจากคำตอบของคำถามที่คล้ายกัน: สร้างไฟเซกเตอร์ใน 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 (ต้องมีชื่อเดียวกันกับรูปร่างไฟล์ที่คุณใช้)


คุณกำลังมองหาวิธีแก้ปัญหานี้หรือไม่? มันใช้งานได้หรือไม่
mgri

โซลูตรอนของคุณแก้ปัญหาทั้งหมดตามที่อธิบายในหัวข้อ! ฉันได้นำไปใช้และเข้าใจว่ากรณีที่แท้จริงของฉันแตกต่างกันเล็กน้อย ขออภัยที่เป็นความผิดของฉัน
E Bobrov

1) ความหนาแน่นของส่วนต่าง ๆ ของฉันบนแผนที่นั้นแตกต่างกันเช่นในกรณีที่ระยะทางสั้น ๆ ระหว่างส่วนระยะทางที่กำหนดในรหัสจะให้ส่วนต่าง ๆ ที่ทับซ้อนกันมากการเปลี่ยนการซูมแผนที่จะไม่ช่วยเลย เพื่ออ่านแผนที่ แต่ในกรณีที่ระยะทางไกลระหว่างภาคแสดงว่าภาคส่วนมีขนาดเล็กมากและอาจจะยากที่จะอ่านแผนที่ การใช้สัญลักษณ์เดียวไม่มีปัญหานั้นเครื่องชั่งจะเปลี่ยนตามการซูมแผนที่
E Bobrov

2) และมีการบิดเบือนแบนด์วิดธ์: 360 องศาของแบนด์วิดธ์มีลักษณะเหมือนไข่ภาคที่มี azimuths ที่แตกต่างกัน แต่ beamwidth เดียวกันไม่เหมือนเซกเตอร์ที่มีลำแสงที่เท่าเทียมกัน เป็นเพราะฉันกำลังใช้ระบบพิกัดทางภูมิศาสตร์หรือไม่ ตอนนี้มุมที่แตกต่างของลองจิจูด / ละติจูดแสดงระยะทางที่แตกต่างกันระหว่างจุดต่างๆบนโลก ดังนั้นวิธีการแก้ปัญหาจะต้องมีการแปลเป็
E Bobrov

ยังไงก็ตามโซลูชันของคุณและการอ้างอิงสำหรับคำตอบที่คล้ายกัน "การสร้างภาคไฟใน QGIS" ช่วยให้ฉันเห็นการทำงานที่มีประโยชน์ ขอขอบคุณอีกครั้ง.
E Bobrov

4

ความรุ่งโรจน์ใหญ่ถึง mgri

ในชั้นทดสอบของเราทุกอย่างทำงานได้อย่างราบรื่น ในชั้นการผลิตหลังจากที่สอง / สามชั่วโมงฉันจัดการเพื่อติดตามปัญหากับ$ เรขาคณิต ได้รับการส่งออกชั้นจุดจากเวทีไม่ได้จะแจ้งให้ทราบ แต่มันก็MultiPoint สิ่งนี้ดูเหมือนจะทำให้เกิดปัญหา: ลูกศรไม่ได้ถูกดึงออกมา; และน่าประหลาดใจมากพอเพียงคะแนนที่คำนวณได้ทำให้รูปหลายเหลี่ยมของวงกลม

สิ่งหนึ่งคือฉันใช้ตัวแปรรัศมี (ไม่แน่ใจว่าเป็นคำที่ถูกต้องในกรณีนี้คุณสามารถตั้งชื่อมันว่า 'ความยาวลำแสง' หรืออะไรก็ได้)

นี่คือสิ่งที่ฉันใช้ตอนนี้กับเลเยอร์เรขาคณิตหลายจุด (ในความเป็นจริงแล้วฟีเจอร์ทั้งหมดเป็นจุดเดียว) และใช้งานได้กับฉันใน QGis 2.18.3

Arrow expression ไม่มีลูกศรถ้า 360 °

CASE

WHEN ("BEAMWIDTH") = 360
THEN 
make_line(
 make_point($x, $y),
 make_point($x + "RADIUS"*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*sin(radians((90 - "AZIMUTH" ))))
)

END

การแสดงออกรูปหลายเหลี่ยม

CASE

WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   make_point($x,$y), "RADIUS"),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      make_point($x,$y),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      make_point($x,$y))
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   make_point($x,$y), "RADIUS"),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       make_point($x,$y),
       make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y - "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       make_point($x,$y))
      )
     )
    )
   )

END

คำตอบของฉันเสนอวิธีการทั่วไป: เนื่องจากมีตัวแปรจำนวนมากที่เกี่ยวข้องกับปัญหาจึงเป็นไปไม่ได้เลยทีเดียวที่จะสร้างวิธีการที่เป็นเอกลักษณ์สำหรับการแก้ไขสถานการณ์ใด ๆ ดังนั้นขอขอบคุณที่ชี้และเสนอแนวทางด้วยคุณสมบัติของ MultiPoint มันจะช่วยคนในอนาคตได้อย่างแน่นอน
mgri

1

ฉันมีพรสวรรค์ในการแก้ปัญหาบางส่วนในเว็บโดยไม่มีปลั๊กอินเพิ่มเติมเพียงแค่ qgis ออกจากกล่อง มันไม่แสดงแบนด์วิดท์ของเสาอากาศเพียงหมุนเครื่องหมายอย่างง่ายในทิศทางที่ถูกต้อง: ใช้เครื่องหมายอย่างง่ายและหมุนด้วยเสาอากาศราบ + 180 องศา (คุณสมบัติของเลเยอร์> ซิมเดียว -> เครื่องหมาย -> เครื่องหมายง่าย -> สามเหลี่ยม -> การหมุน> แก้ไข -> พิมพ์ <180 + "เสาอากาศ azimuth"> ในฟิลด์นิพจน์และตั้งค่า Top ในฟิลด์จุดยึดของเครื่องหมาย) การใช้ <180 + "เสาอากาศราบ"> เป็นสิ่งจำเป็นเนื่องจากทิศทางที่ไม่เหมาะสมของเครื่องหมายสามเหลี่ยมง่ายฝัง มิฉะนั้นจะแสดงทิศทางเสาอากาศผิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.