Anzeigen von Antennensymbolen auf der Karte: Punktsymbole oder Merkmale (Polygone)

12

Ich möchte ein Mobilfunknetz auf einer Karte anzeigen. Eingabedaten sind eine CSV-Datei, in der jede Zeichenfolge ein Mobilfunksektor ist. Die Attribute sind: Sektor-ID, seine Koordinaten, sein Azimut und ein Winkel der Antennenstrahlbreite.

Die Werte für die Antennenstrahlbreite liegen im Bereich von 30 bis 360 Grad. 360 Antennenstrahlbreite bedeutet, dass es auf der Karte als Kreis angezeigt werden muss. Antennen mit anderen Strahlbreiten müssen als Sektoren mit geeigneten Öffnungswinkeln dargestellt werden.

Geben Sie hier die Bildbeschreibung ein

Ist es möglich, die Antennen nur mit Symbolen anzuzeigen? Ich weiß, wie ich mein eigenes SVG-Symbol erstelle, und hoffe, es nach dem Azimut drehen zu können. Aber gibt es eine Möglichkeit, eine variable Antennenstrahlbreite entsprechend ihrem Attributwert von 30 bis 360 Grad anzuwenden?

Ich denke, die Symbole sind aufgrund der dynamischen Visualisierung auf der Karte entsprechend dem Maßstab der Ansicht der beste Weg, um die Antennen zu zeichnen, wenn dies in QGIS möglich ist.

Natürlich kann die Aufgabe gelöst werden, indem geeignete Polygone als Ebenenmerkmal gezeichnet werden, aber das wäre eine Problemumgehungslösung.

E Bobrov
quelle
Sie müssen also den Bogen in die richtige Richtung zeichnen, die für jeden Standort unterschiedlich ist?
Nathan W
Überhaupt nicht Wenn ich es richtig verstehe. Es muss ein Kreissektor sein (oder der gesamte Kreis bei einer Strahlbreite von 360), wie im Bild gezeigt.
E Bobrov
Ja, das meine ich.
Nathan W
OK, ich verstehe. Im Allgemeinen wird das Bogensymbol nicht unbedingt benötigt. Die Hauptattribute sind Azimut und Strahlbreite. Ich kann jedes Symbol verwenden, um die Antennen nicht nur als Bogen zu zeichnen.
E Bobrov
Wahrscheinlich habe ich das Beispiel gefunden, das helfen könnte: Erstellen von benutzerdefinierten Symbolebenentypen . Aber ich bin mir nicht sicher. Also hat jemand versucht, eine eigene Symbol-Layer-Klasse zu erstellen, die zum Beispiel jede Layer-Feature-Richtung in Abhängigkeit von ihrem Attribut zeichnet (dh Antennenazimut in den Worten des obigen Bildes)?
E Bobrov

Antworten:

7

Vor einigen Tagen wurde QGIS ein neues Plugin namens Wedge Buffer Processing Algorithm hinzugefügt . Dies sieht so aus, als ob es von Interesse sein könnte.

Wie der Name schon sagt, handelt es sich um einen Verarbeitungsalgorithmus. Sie müssen ihn daher über die Verarbeitungs-Toolbox ausführen. Ich hatte noch keine Gelegenheit, es zu versuchen.

Es werden Kreissektoren erstellt - wie bei einem normalen Kreispuffer, aber der Keilwinkel und der Radius können mithilfe von Feldwerten eingestellt werden.

Dokumentation und Screenshots finden Sie auf der Github-Seite

Steven Kay
quelle
10

Wenn Sie nur Symbologie verwenden möchten, schlage ich eine Lösung vor, die von meiner Antwort auf eine ähnliche Frage inspiriert ist: Erstellen von Sektorlichtern in QGIS? .


Nach einem ähnlichen Ansatz und unter der Annahme, dass Sie an einem projizierten CRS arbeiten (wenn Sie stattdessen ein geografisches Koordinatensystem verwenden, lesen Sie den Hinweis am Ende der Antwort), möchte ich unterstreichen, dass ich die Aufmerksamkeit auf die Erklärung richten werde Dies bedeutet, dass einige andere kleinere Parameter (wie Größen, Breiten usw.) von Ihnen leicht angepasst werden sollten, um Ihren Anforderungen besser zu entsprechen.

Außerdem gehe ich davon aus, dass dies "AZIMUTH"das Feld ist, in dem die Azimutwerte gespeichert sind, und "BEAMWIDTH"das Feld, in dem die Antennenstrahlbreiten gespeichert sind.

Lösung

Wir werden die Punkte mit a Single symbolund rendern, indem wir zu einer Simple Markerund zwei Geometry generatorSymbolebenen zurückkehren:

Geben Sie hier die Bildbeschreibung ein

In der weiteren Erklärung werde ich der gleichen Reihenfolge der Symbole im obigen Bild folgen.

1) Einfacher Marker

Ich habe ein Standardsymbol für einen roten Kreis gewählt (dies ist der einfachere Teil dieses Tutorials), mit einer Größe von 3 mm und einer Breite von 0,4 mm.

2) Geometriegenerator Nr. 1

Fügen Sie eine neue Symbolebene hinzu und wählen Sie die Geometry generatorund die LineString / MultiLineStringTypen aus:

Geben Sie hier die Bildbeschreibung ein

Fügen Sie diesen Ausdruck in das ExpressionFeld ein:

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

Wir haben gerade den Pfeil definiert, der auf die Azimutmenge zeigt (denken Sie zum Erstellen des Pfeils daran, den ArrowSymbolebenentyp unter der LineOption im Hauptsymbolmenü auszuwählen ). Bitte beachten Sie, dass dies 300eine Entfernung in Metern darstellt und ein beliebiger Wert ist. Sie können ihn also nach Ihren Wünschen ändern.

3) Geometriegenerator Nr. 2

Fügen Sie eine neue Symbolebene hinzu und wählen Sie den Geometry generatorTyp und die Polygon / MultiPolygonTypen aus:

Geben Sie hier die Bildbeschreibung ein

Fügen Sie diesen Ausdruck in das ExpressionFeld ein:

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

Wir haben gerade den Sektor definiert. Bitte beachten Sie, dass 200und 2000stellen Entfernungen in Metern dar und sie sind willkürliche Werte, da ich versuche, ein Polygon zu erstellen, das sich mit dem Kreis mit einem Radius von 200 m schneidet. Sie können sie also nach Ihren Wünschen ändern.

Endergebnis

Wenn Sie die vorherigen Aufgaben korrekt ausführen, sollten Sie in der Lage sein, Ergebnisse wie diese zu erhalten (die Beschriftungen werden neben dieser Lösung hinzugefügt und sollten nur den Kontext besser erklären):

Geben Sie hier die Bildbeschreibung ein

Hinweis

Wenn Sie ein geografisches Koordinatensystem verwenden , dh wenn Sie sich mit Graden und nicht mit Entfernungen befassen, sollte es ausreichen, die richtigen Werte zu verwenden, wenn ich eine Entfernung in den vorherigen Formeln verwendet habe. Die Entfernungen, die ich verwendet habe, sind:

  • 300 m (siehe Geometriegenerator Nr. 1);
  • 200 m (siehe Geometriegenerator Nr. 2);
  • 2000 m (siehe Geometriegenerator Nr. 2);

so dass Sie es mit anderen beliebigen Werten ersetzen können in Grad (zum Beispiel ausgedrückt 0.0002, 0.002und so weiter).

Bonus

Ich habe den Stil hier angehängt : Sie können diesen Code mit einem beliebigen Texteditor öffnen und als QGIS-Layer-Style-Datei (dh mit einer .qmlErweiterung) speichern .

Der obige Stil wurde mit QGIS 2.18.4 erstellt (er muss denselben Namen wie das von Ihnen verwendete Shapefile haben).

mgri
quelle
Haben Sie nach dieser Lösung gesucht? Funktioniert es?
Mgri
Ihre Lösung löst den im Thema beschriebenen Fall vollständig! Ich habe es implementiert und verstanden, dass mein eigener realer Fall etwas anders ist. Entschuldigung, das ist meine Schuld.
E Bobrov
1) Die Dichte meiner Sektoren auf der Karte ist unterschiedlich, dh bei kurzen Entfernungen zwischen Sektoren überlappt die definierte Entfernung im Code viele Sektoren. Eine Änderung des Kartenzooms würde nicht helfen, daher ist es ziemlich schwierig um die Karte zu lesen. Bei großen Entfernungen zwischen den Sektoren sind die Sektoren jedoch sehr klein und möglicherweise schwer zu lesen. Das Verwenden einzelner Symbole ist frei von diesem Problem. Ihre Skalierung ändert sich mit dem Zoomen der Karte.
E Bobrov
2) Und es gibt Strahlbreitenverzerrungen: Strahlbreite 360 ​​Grad sehen aus wie Ellipsen, Sektoren mit unterschiedlichen Azimuten, aber dieselbe Strahlbreite sieht nicht aus wie Sektoren mit äquivalenten Strahlbreiten. Liegt es daran, dass ich das geografische Koordinatensystem verwende? Sie repräsentieren nun unterschiedliche Längen- / Breitengrade für unterschiedliche Entfernungen zwischen Punkten auf der Erde. Daher musste die Lösung auf die Erdgebiete beschränkt werden, in denen sich Sektoren befinden.
E Bobrov
Wie auch immer, Ihre Lösung und die Referenz für eine ähnliche Antwort "Erstellen von Sektorlichtern in QGIS?" hat mir geholfen, einige nützliche Funktionen zu sehen. Danke nochmal.
E Bobrov
4

Ein großes Lob an Mgri.

In unserer Testschicht hat alles reibungslos funktioniert. In einer Produktionsschicht gelang es mir nach zwei bis drei Stunden, ein Problem mit der $ Geometrie aufzuspüren . Hatte eine Punktebene von einer Plattform exportiert, nicht bemerkt, aber es war MultiPoint . Dies schien Probleme zu verursachen: Der Pfeil wurde nicht gezeichnet; und seltsamerweise bildeten nur die berechneten Punkte das Polygon der Kreise.

Eine andere Sache ist, dass ich einen variablen Radius verwende . (Ich bin mir nicht sicher, ob es in diesem Fall das richtige Wort ist. Sie können es auch als "Strahllänge" oder was auch immer bezeichnen.)

Folgendes verwende ich jetzt mit einem Layer vom Typ MultiPoints-Geometrie (obwohl alle Features ein einzelner Punkt sind), der in QGis 2.18.3 für mich funktioniert

Pfeilausdruck Kein Pfeil bei 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

Polygonausdruck

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
quelle
Meine Antwort schlug einen allgemeinen Ansatz vor: Da das Problem viele Variablen umfasste, war es unmöglich, ein einzigartiges Verfahren zur Lösung einer Situation zu erstellen. Vielen Dank, dass Sie darauf hingewiesen und einen Ansatz mit MultiPoint-Funktionen vorgeschlagen haben. Es wird sicherlich in Zukunft jemandem helfen.
Mgri
1

Ich war mit Teillösung im Web ohne zusätzliche Plugins begabt, nur qgis out of the box. Die Strahlbreite der Antenne wird nicht angezeigt. Drehen Sie einfach den einfachen Marker in die richtige Richtung: Verwenden Sie den einfachen Marker und drehen Sie ihn mit dem Antennenazimut + 180 Grad (Ebeneneigenschaften> Einzelsimbol-> Marker-> Einfacher Marker-> Dreieck-> Drehung-> Bearbeiten) -> Geben Sie <180 + "Antennenazimut"> in das Ausdrucksfeld ein und setzen Sie im Feld Ankerpunkt des Markers die Option Oben. Die Verwendung von <180 + "Antennenazimut"> ist aufgrund der ungeeigneten Richtung des eingebetteten einfachen Dreiecksmarkers erforderlich. Andernfalls wird die falsche Antennenrichtung angezeigt.

E Bobrov
quelle