BEARBEITEN Ich habe die Antwort bearbeitet, um bestimmte Situationen (aufgrund bestimmter Winkelwerte) zu verwalten und um die gepunkteten Linien nicht anzuzeigen, wenn ein runder Winkel definiert ist.
Ich schlage eine Lösung vor, indem ich nur regelbasierte Symbologie und Beschriftung wiederhole.
Bevor ich anfange, möchte ich unterstreichen, dass ich mich auf die Erklärung der minimalen Dinge konzentrieren werde, die für die Reproduktion des gewünschten Ergebnisses zu tun sind: Dies bedeutet, dass einige andere kleinere Parameter (wie Größen, Breiten usw.) von Ihnen einfach angepasst werden sollten für eine bessere Anpassung an Ihre Bedürfnisse.
Darüber hinaus funktioniert diese Lösung nur, wenn Sie davon ausgehen, dass der 0
Grad Nord statt Süd ist (wenn dies 0
Süd ist, würde es ausreichen 180
, jedes Mal einen Wert zu summieren , der in Formeln, die sich mit Winkeln befassen, mit einer '90' angegeben wird, z . B. cos(radians(90))
wird cos(radians(180 + 90))
). Ich habe es vorgezogen, dies nur zu tun, um eine allgemeinere Lösung zu finden.
Styling
Wir werden die Punkte mit einem Single symbol
und rendern, indem wir uns auf eine Simple Marker
und drei Geometry generator
Symbolebenen wiederholen :
In der weiteren Erläuterung folge ich der gleichen Reihenfolge der Symbole im obigen Bild.
1) Einfacher Marker
Ich habe ein Standardsymbol für einen schwarzen Stern (dies ist der einfachere Teil dieses Tutorials) mit einer Größe von 3 mm und einer Breite von 0,4 mm ausgewählt.
2) Geometriegenerator Nr. 1
Fügen Sie eine neue Symbolebene hinzu und wählen Sie den Geometry generator
Typ:
Fügen Sie diesen Ausdruck in das Expression
Feld ein:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "ALKUKULMA")),
$y + 1000*sin(radians(90 - "ALKUKULMA"))
)
)
END
Wir haben gerade die erste Linie definiert, die auf den Punkt zeigt, an dem der Lichtsektor beginnt. Diese Linie ist 1000 m lang und wird nur erstellt, wenn der Öffnungswinkel des Sektorlichts kein runder Winkel ist (dies geschieht, um zu vermeiden, dass die Linie einen ganzen Kreis durchbricht).
3) Geometriegenerator Nr. 2
Wie oben, aber in diesem Schritt müssen Sie diesen Ausdruck verwenden:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "LOPPUKULMA")),
$y + 1000*sin(radians(90 - "LOPPUKULMA"))
)
)
END
Wir haben gerade die erste Linie definiert, die auf den Punkt zeigt, an dem der Lichtsektor endet. Diese Linie ist 1000 m lang und wird nur erstellt, wenn der Öffnungswinkel des Sektorlichts kein runder Winkel ist (dies geschieht, um zu vermeiden, dass die Linie einen ganzen Kreis durchbricht).
4) Geometriegenerator Nr. 3
Fügen Sie diesen Ausdruck in das Expression
Feld ein:
CASE
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
END
Wir haben gerade den Bogen zwischen dem Start- und dem Endpunkt des Lichtsektors definiert (bitte beachten Sie, dass dies 2000
ein willkürlicher Wert ist, da ich versuche, ein Polygon zu erstellen , das die Grenze des Kreises mit einem Radius von 900 m schneidet).
Außerdem müssen wir die Farbe einstellen, die im "VARIS"
Feld gespeichert ist. Dazu müssen wir es mit einem benutzerdefinierten Ausdruck angeben. Folgen Sie dem Pfeil im Bild unten:
und geben Sie diesen Ausdruck ein, nachdem Sie auf die Edit...
Schaltfläche geklickt haben :
CASE
WHEN "VARIS" = 'vi' THEN color_rgb(51,160,44)
WHEN "VARIS" = 'v' THEN color_rgb(255,255,255)
WHEN "VARIS" = 'p' THEN color_rgb(227,26,28)
END
Bitte beachten Sie, dass ich für diese Symbolebene zwei Linien erstellt habe: Die obere Linie definiert die zu verwendende Farbe (in der Tat habe ich den benutzerdefinierten Ausdruck für diese festgelegt), während die untere nützlich ist, um einen schwarzen Rand zu definieren (dies wird der Fall sein) eine Breite, die größer ist als die der oberen Zeile). Denken Sie auch daran, Flat
wie Cap style
für beide Linien festzulegen, um Farbüberlappungen zu vermeiden.
Beschriftung
1) Etiketten setzen
Gehe zu Layer Properties
> Labels
und folge wie gewohnt den roten Pfeilen:
und geben Sie dann diesen Ausdruck ein:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
Wir haben die Farbregel mit dem im "VARIS"
Feld gespeicherten Wert definiert.
2) Einstellen der Platzierung für Etiketten
Wählen Sie die Placement
Option im Labels
Menü und wählen Sie Offset from point
.
Dann mit Bezug auf das Bild unten:
folge dem roten Pfeil und tippe diesen Ausdruck:
CASE
WHEN "ALKUKULMA" > "LOPPUKULMA"
THEN
concat(
-1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
WHEN "ALKUKULMA" <= "LOPPUKULMA"
THEN
concat(
1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
-1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
END
Folgen Sie dann dem grünen Pfeil und geben Sie diesen Ausdruck ein:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Endergebnis
Wenn Sie die vorherigen Aufgaben korrekt ausgeführt haben, sollten Sie in der Lage sein, das folgende Ergebnis zu erhalten:
Bonus
Da die untergeordneten Parameter zu viele waren, um in dieser Antwort vollständig behandelt zu werden, habe ich den Stil hier angehängt : Sie können diesen Code mit einem beliebigen Texteditor öffnen und als QGIS Layer Style-Datei (dh mit einer .qml
Erweiterung) speichern .
Der obige Stil wurde mit QGIS 2.18.4 erstellt (er muss denselben Namen wie das von Ihnen verwendete Shapefile haben).