Menampilkan simbol antena di peta: simbol titik atau fitur (poligon)

12

Saya ingin menunjukkan jaringan seluler di peta. Input data adalah file .csv di mana setiap string adalah sektor seluler. Atributnya adalah: id sektor, koordinatnya, azimutnya, dan sudut lebar antena.

Nilai lebar berkas antena berada dalam kisaran 30 hingga 360 derajat. Lebar sinar antena 360 artinya harus ditampilkan di peta sebagai lingkaran. Antena dengan lebar sinar lain harus ditampilkan sebagai sektor dengan sudut bukaan yang sesuai.

masukkan deskripsi gambar di sini

Apakah mungkin untuk menunjukkan antena menggunakan simbol saja? Saya tahu cara membuat simbol SVG saya sendiri dan berharap menemukan cara memutarnya sesuai dengan azimuth. Tetapi apakah ada cara untuk menerapkan lebar antena variabel sesuai dengan nilai atributnya dari 30 hingga 360 derajat?

Saya pikir simbol adalah cara terbaik untuk menggambar antena karena visualisasi dinamis pada peta sesuai dengan skala tampilan, jika cara ini dimungkinkan dalam QGIS.

Tentu saja, tugas tersebut dapat diselesaikan dengan menggambar poligon yang sesuai sebagai fitur layer, tetapi itu akan menjadi solusi penyelesaian masalah.

E Bobrov
sumber
Jadi Anda perlu menggambar busur ke arah yang benar yang berbeda untuk setiap situs?
Nathan W
Tidak sama sekali Jika saya mengerti benar. Itu harus sektor lingkaran (atau seluruh lingkaran dalam kasus beamwidth = 360) seperti yang ditunjukkan pada gambar.
E Bobrov
Ya itu yang saya maksud.
Nathan W
Ok aku paham. Berbicara secara umum simbol busur tidak diperlukan secara ketat. Atribut utama adalah azimuth dan beamwidth. Saya bisa menggunakan simbol apa pun untuk menggambar antena bukan hanya busur.
E Bobrov
Mungkin saya telah menemukan contoh yang dapat membantu: Membuat Jenis Lapisan Simbol Kustom . Tapi saya tidak yakin. Jadi siapa pun mencoba membuat kelas simbol layer Anda sendiri yang menggambar misalnya setiap arah fitur lapisan tergantung pada atributnya (yaitu antena azimuth pada kata-kata gambar di atas)?
E Bobrov

Jawaban:

7

Beberapa hari yang lalu sebuah plugin baru ditambahkan ke QGIS yang disebut Wedge Buffer Processing Algorithm . Ini sepertinya menarik.

Seperti namanya, ini adalah algoritma pemrosesan, jadi Anda harus menjalankannya dari kotak alat pemrosesan. Namun belum sempat mencobanya.

Ini menciptakan sektor lingkaran - seperti buffer lingkaran normal, tetapi sudut irisan dan jari-jari dapat diatur menggunakan nilai-nilai bidang.

Dokumentasi dan tangkapan layar dapat dilihat di halaman github

Steven Kay
sumber
10

Jika Anda hanya ingin menggunakan simbologi, saya mengusulkan solusi yang terinspirasi oleh jawaban saya dari pertanyaan serupa: Membuat lampu sektor di QGIS? .


Mengikuti pendekatan yang serupa, dan dengan asumsi Anda sedang mengerjakan Proyeksi CRS (sebagai gantinya, jika Anda menggunakan Sistem Koordinat Geografis, lihat catatan di akhir jawaban), saya ingin menggarisbawahi bahwa saya akan memusatkan perhatian pada penjelasan. dari hal-hal minimal yang harus dilakukan untuk mereproduksi hasil yang diinginkan: ini berarti bahwa beberapa parameter kecil lainnya (seperti ukuran, lebar dan sebagainya) harus mudah disesuaikan oleh Anda untuk lebih sesuai dengan kebutuhan Anda.

Lebih jauh, saya berasumsi bahwa "AZIMUTH"bidang yang menyimpan nilai azimuth dan "BEAMWIDTH"bidang yang menyimpan lebar berkas antena.

Larutan

Kami akan memberikan poin dengan a Single symboldan dengan berulang ke satu Simple Markerdan dua Geometry generatorlapisan simbol:

masukkan deskripsi gambar di sini

Dalam penjelasan lebih lanjut, saya akan mengikuti urutan simbol yang sama pada gambar di atas.

1) Penanda Sederhana

Saya memilih simbol default lingkaran merah (ini adalah bagian yang lebih mudah dari tutorial ini), memiliki ukuran 3 mm dan lebar 0,4 mm.

2) Generator Geometri No. 1

Tambahkan layer simbol baru dan pilih Geometry generatordan LineString / MultiLineStringjenisnya:

masukkan deskripsi gambar di sini

Masukkan ungkapan ini di Expressionbidang:

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

Kami baru saja mendefinisikan panah yang menunjuk ke arah set azimuth (untuk membuat panah, ingatlah untuk memilih Arrowjenis lapisan simbol di bawah Lineopsi dari Menu simbol utama). Harap perhatikan bahwa 300mewakili jarak dalam meter dan ini merupakan nilai arbitrer, jadi silakan mengubahnya sesuai dengan kebutuhan Anda.

3) Generator Geometri No. 2

Tambahkan layer simbol baru dan pilih Geometry generatortipe dan Polygon / MultiPolygontipe:

masukkan deskripsi gambar di sini

Masukkan ungkapan ini di Expressionbidang:

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

Kami baru saja mendefinisikan sektor ini. Harap perhatikan bahwa 200dan 2000wakili jarak dalam meter dan ini adalah nilai arbitrer karena saya mencoba membuat poligon untuk memotong lingkaran yang memiliki radius 200 m, jadi jangan ragu untuk mengubahnya sesuai dengan kebutuhan Anda.

Hasil akhir

Jika Anda melakukan tugas-tugas sebelumnya dengan benar, Anda harus bisa mendapatkan hasil seperti ini (label ditambahkan terpisah dari solusi ini dan mereka seharusnya hanya menjelaskan konteksnya dengan lebih baik):

masukkan deskripsi gambar di sini

Catatan

Jika Anda menggunakan Sistem Koordinat Geografis , yaitu jika Anda berurusan dengan derajat dan tidak dengan jarak, itu harus cukup menggunakan nilai yang tepat ketika saya menggunakan jarak dalam rumus sebelumnya. Jarak yang saya gunakan adalah:

  • 300 m (lihat Generator Geometri No. 1);
  • 200 m (lihat Generator Geometri No. 2);
  • 2000 m (lihat Generator Geometri No. 2);

jadi Anda bisa menggantinya dengan nilai arbitrer lain yang dinyatakan dalam derajat (misalnya 0.0002,, 0.002dan sebagainya).

Bonus

Saya telah melampirkan style di sini : Anda dapat membuka kode ini dengan editor teks apa pun dan menyimpannya sebagai file QGIS Layer Style (yaitu dengan .qmlekstensi).

Gaya di atas dibuat menggunakan QGIS 2.18.4 (harus memiliki nama yang sama dengan shapefile yang Anda gunakan).

mgri
sumber
Apakah Anda mencari solusi ini? Apakah itu bekerja?
mgri
Soluton Anda benar-benar menyelesaikan kasus yang dijelaskan dalam topik! Saya sudah menerapkannya dan mengerti bahwa kasus saya sendiri sedikit berbeda. Maaf itu salah saya.
E Bobrov
1) Kepadatan sektor saya di peta berbeda, yaitu jika terjadi jarak pendek antar sektor, jarak yang ditentukan dalam kode akan memberikan banyak sektor yang tumpang tindih, mengubah zoom peta tidak akan membantu, sehingga akan agak sulit untuk membaca peta. Tetapi dalam kasus jarak yang jauh antar sektor menunjukkan sektor akan sangat kecil dan mungkin sulit untuk membaca peta. Menggunakan satu simbol bebas dari masalah itu, skala mereka berubah dengan pembesaran peta.
E Bobrov
2) Dan ada distorsi beamwidth: beamwidth 360 derajat terlihat seperti elips, sektor dengan azimuth yang berbeda tetapi beamwidth yang sama tidak terlihat seperti sektor dengan beamwidth yang sama. Apakah itu karena saya menggunakan Sistem Koordinat Geografis? Anda sekarang, berbagai sudut bujur / lintang mewakili jarak yang berbeda antara titik-titik di bumi. Jadi solusi perlu dilokalkan ke wilayah Bumi di mana sektor berada.
E Bobrov
Pokoknya solusi Anda dan referensi untuk jawaban serupa "Membuat lampu sektor di QGIS?" membantu saya melihat beberapa fungsi yang bermanfaat. Terima kasih lagi.
E Bobrov
4

Pujian besar untuk mgri.

Di lapisan pengujian kami, semuanya bekerja dengan lancar. Dalam lapisan produksi, setelah dua / tiga jam, saya berhasil melacak masalah $ geometri . Sudah mengekspor lapisan titik dari platform, tidak memperhatikan, tapi itu MultiPoint . Ini tampaknya menyebabkan masalah: panah tidak ditarik; dan anehnya hanya titik yang dihitung yang membuat poligon lingkaran.

Hal lain adalah saya menggunakan radius variabel . (tidak yakin apakah itu kata yang tepat dalam kasus ini, Anda juga bisa menamainya 'panjang balok' atau apa pun).

Inilah yang saya gunakan sekarang, dengan lapisan tipe geometri MultiPoints (padahal sebenarnya semua fitur adalah satu titik), dan berfungsi untuk saya di QGis 2.18.3

Ekspresi panah Tidak panah jika 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

Ekspresi poligon

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
jbostoen
sumber
Jawaban saya mengusulkan pendekatan umum: karena ada banyak variabel yang terlibat dalam masalah ini, sangat tidak mungkin untuk membuat prosedur unik untuk menyelesaikan situasi apa pun. Jadi, terima kasih telah menunjukkan dan mengusulkan pendekatan dengan fitur MultiPoint, itu pasti akan membantu seseorang di masa depan.
mgri
1

Saya berbakat dengan solusi parsial di web tanpa plugin tambahan, hanya qgis di luar kotak. Itu tidak menunjukkan antena beamwidth, hanya memutar penanda sederhana ke arah yang benar: gunakan penanda sederhana dan putar dengan antena azimuth + 180 derajat (Properti Lapisan> Simbol Tunggal-> Penanda-> Penanda sederhana-> segitiga-> rotasi-> edit -> ketik <180 + "antenna azimuth"> di bidang ekspresi. Dan juga atur Top di bidang Anchor point dari marker). Menggunakan <180 + "antena azimuth"> diperlukan karena arah yang tidak tepat dari penanda segitiga sederhana yang tertanam. Kalau tidak, itu akan menunjukkan arah antena yang salah.

E Bobrov
sumber