Visualizzazione dei simboli dell'antenna sulla mappa: simboli o caratteristiche dei punti (poligoni)


12

Voglio mostrare una rete cellulare su una mappa. I dati di input sono un file .csv in cui ogni stringa è un settore cellulare. Gli attributi sono: ID settore, coordinate, azimut e angolo della larghezza del raggio dell'antenna.

I valori di larghezza del raggio dell'antenna sono compresi tra 30 e 360 ​​gradi. La larghezza del raggio di 360 antenne significa che deve essere mostrato sulla mappa come un cerchio. Le antenne con altre larghezze del fascio devono essere mostrate come settori con angoli di apertura appropriati.

inserisci qui la descrizione dell'immagine

È possibile mostrare le antenne usando solo i simboli? So come creare il mio simbolo SVG e spero di trovare come ruotarlo secondo l'azimut. Ma c'è un modo per applicare la larghezza variabile del raggio dell'antenna in base al suo valore di attributo da 30 a 360 gradi?

Penso che i simboli siano il modo migliore per disegnare le antenne a causa della visualizzazione dinamica sulla mappa in base alla scala di visualizzazione, se in QGIS questo è possibile.

Naturalmente, l'attività può essere risolta disegnando poligoni appropriati come funzionalità di livello, ma sarebbe una soluzione alternativa.


Quindi devi disegnare l'arco nella giusta direzione, che è diverso per ogni sito?
Nathan W,

Niente affatto se ho capito bene. Deve essere un settore di cerchio (o l'intero cerchio in caso di larghezza del fascio = 360) come mostrato in figura.
E Bobrov,

Sì, questo è ciò che intendo.
Nathan W,

Va bene, ho capito. Parlare in generale il simbolo dell'arco non è strettamente necessario. Gli attributi principali sono azimut e larghezza del fascio. Posso usare qualsiasi simbolo per disegnare le antenne non solo un arco.
E Bobrov,

Probabilmente ho trovato l'esempio che può essere d'aiuto: Creazione di tipi di layer di simboli personalizzati . Ma non ne sono sicuro. Quindi qualcuno ha cercato di creare la propria classe di layer di simboli che disegna ad esempio la direzione di ogni layer in base al suo attributo (ovvero azimut dell'antenna nelle parole della figura sopra)?
E Bobrov,

Risposte:


7

Qualche giorno fa un nuovo plugin è stato aggiunto a QGIS chiamato Wedge Buffer Processing Algorithm . Questo potrebbe sembrare interessante.

Come suggerisce il nome è un algoritmo di elaborazione, quindi dovrai eseguirlo dalla casella degli strumenti di elaborazione. Non ho ancora avuto la possibilità di provarlo.

Crea settori di cerchi, come un normale buffer circolare, ma l'angolo di cuneo e il raggio possono essere impostati utilizzando i valori di campo.

Documentazione e schermate sono disponibili nella pagina di github


10

Se si desidera utilizzare solo la simbologia, propongo una soluzione ispirata alla mia risposta da una domanda simile: la creazione di luci di settore in QGIS? .


Seguendo un approccio simile e supponendo che tu stia lavorando su un CRS proiettato (invece, se stai usando un sistema di coordinate geografiche, vedi la nota alla fine della risposta), voglio sottolineare che focalizzerò l'attenzione sulla spiegazione delle cose minime da fare per riprodurre il risultato desiderato: questo significa che alcuni altri parametri minori (come dimensioni, larghezze e così via) dovrebbero essere facilmente regolati da te per adattarsi meglio alle tue esigenze.

Inoltre, suppongo che "AZIMUTH"sia il campo che memorizza i valori di azimut ed "BEAMWIDTH"è il campo che memorizza le larghezze del raggio dell'antenna.

Soluzione

Renderemo i punti con a Single symbole ricorrendo a uno Simple Markere due Geometry generatorlivelli simbolo:

inserisci qui la descrizione dell'immagine

Nell'ulteriore spiegazione, seguirò lo stesso ordine dei simboli nell'immagine sopra.

1) Indicatore semplice

Ho scelto un simbolo predefinito di un cerchio rosso (questa è la parte più semplice di questo tutorial), con una dimensione di 3 mm e una larghezza di 0,4 mm.

2) Geometry Generator No. 1

Aggiungi un nuovo livello simbolo e seleziona Geometry generatori LineString / MultiLineStringtipi e:

inserisci qui la descrizione dell'immagine

Inserisci questa espressione nel Expressioncampo:

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

Abbiamo appena definito la freccia che punta verso il set di azimut (per creare la freccia, ricordati di selezionare il Arrowtipo di livello del simbolo sotto l' Lineopzione dal menu principale del simbolo). Tieni presente che 300rappresenta una distanza in metri ed è un valore arbitrario, quindi sentiti libero di cambiarlo in base alle tue esigenze.

3) Geometry Generator No. 2

Aggiungi un nuovo livello simbolo e seleziona il Geometry generatortipo e i Polygon / MultiPolygontipi:

inserisci qui la descrizione dell'immagine

Inserisci questa espressione nel Expressioncampo:

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

Abbiamo appena definito il settore. Si prega di notare che 200e 2000rappresentano distanze in metri e sono valori arbitrari perché sto cercando di creare un poligono ad intersecare con il cerchio avente un raggio di 200 m, quindi sentitevi liberi di modificarli in base alle proprie esigenze.

Risultato finale

Se esegui correttamente le attività precedenti, dovresti essere in grado di ottenere risultati come questi (le etichette vengono aggiunte separatamente da questa soluzione e dovrebbero solo spiegare meglio il contesto):

inserisci qui la descrizione dell'immagine

Nota

Se stai usando un sistema di coordinate geografiche , cioè se hai a che fare con gradi e non con distanze, dovrebbe essere sufficiente usare i valori corretti quando ho usato una distanza nelle formule precedenti. Le distanze che ho usato sono:

  • 300 m (vedi Geometry Generator No. 1);
  • 200 m (vedi Geometry Generator No. 2);
  • 2000 m (vedi Geometry Generator No. 2);

quindi è possibile sostituirlo con altri valori arbitrari espressi in gradi (ad esempio 0.0002, 0.002e così via).

indennità

Ho allegato lo stile qui : puoi aprire questo codice con qualsiasi editor di testo e salvarlo come file QGIS Layer Style (cioè con .qmlun'estensione).

Lo stile sopra è stato creato usando QGIS 2.18.4 (deve avere lo stesso nome dello shapefile che stai usando).


Stavi cercando questa soluzione? Funziona?
mgri

Il tuo soluton risolve totalmente il caso descritto nell'argomento! L'ho implementato e ho capito che il mio caso reale è leggermente diverso. Scusa, è colpa mia.
E Bobrov,

1) La densità dei miei settori sulla mappa è diversa, vale a dire in caso di brevi distanze tra settori la distanza definita nel codice darà molti settori sovrapposti, cambiare lo zoom della mappa non sarebbe di aiuto, quindi sarà piuttosto difficile per leggere la mappa. Ma in caso di lunghe distanze tra settori mostrati, i settori saranno molto piccoli e forse difficili da leggere sulla mappa. L'uso di singoli simboli è privo di questo problema, le loro scale cambiano con uno zoom della mappa.
E Bobrov,

2) E ci sono distorsioni della larghezza del fascio: la larghezza del fascio a 360 gradi sembra ellissi, i settori con azimut differenti ma la stessa larghezza del fascio non assomiglia a settori con larghezze del fascio equivalenti. Lo fa perché sto usando il sistema di coordinate geografiche? Ora, diversi angoli di longitudine / latitudine rappresentano una distanza diversa tra i punti sulla terra. Quindi la soluzione doveva essere localizzata nelle aree terrestri in cui si trovano i settori.
E Bobrov,

Ad ogni modo la tua soluzione e il riferimento per una risposta simile "Creazione di luci di settore in QGIS?" mi ha aiutato a vedere alcune funzionalità utili. Grazie ancora.
E Bobrov,

4

Grandi complimenti a mgri.

Nel nostro livello di test, tutto ha funzionato senza problemi. In un livello di produzione, dopo due / tre ore, sono riuscito a rintracciare un problema con $ geometry . Aveva esportato uno strato di punti da una piattaforma, non se ne accorse, ma era MultiPoint . Ciò sembrava causare problemi: la freccia non era disegnata; e stranamente solo i punti calcolati hanno fatto il poligono dei cerchi.

Un'altra cosa è che sto usando un raggio variabile . (non sono sicuro che sia la parola giusta in questo caso, potresti anche chiamarla "lunghezza del raggio" o altro).

Ecco quello che sto usando ora, con un livello di tipo di geometria MultiPoints (mentre in realtà tutte le funzionalità sono un singolo punto), e funziona per me in QGis 2.18.3

Espressione della freccia Nessuna freccia se 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

Espressione poligonale

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

La mia risposta ha proposto un approccio generale: poiché c'erano molte variabili coinvolte nel problema, era abbastanza impossibile creare una procedura unica per risolvere qualsiasi situazione. Quindi, grazie per averlo indicato e proposto un approccio con le funzionalità MultiPoint, sicuramente aiuterà qualcuno in futuro.
mgri,

1

Sono stato dotato di una soluzione parziale nel Web senza plug-in aggiuntivi, solo qgis out of the box. Non mostra la larghezza del raggio dell'antenna, basta ruotare un semplice marker nella giusta direzione: usa un semplice marker e ruotalo con l'antenna azimut + 180 gradi (Proprietà livello> Simbol singolo-> Indicatore-> Indicatore semplice-> triangolo-> rotazione-> modifica -> digita <180 + "antenna azimut"> nel campo dell'espressione. E imposta anche Top nel campo Punto di ancoraggio del marker). L'utilizzo di <180 + "antenna azimut"> è necessario a causa della direzione inappropriata del marcatore a triangolo semplice incorporato. Altrimenti mostrerà una direzione dell'antenna sbagliata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.