EDIT Ho modificato la risposta per la gestione di situazioni particolari (a causa di valori angolari specifici) e per non visualizzare le linee tratteggiate quando viene definito un angolo arrotondato.
Propongo una soluzione ricorrendo solo alla simbologia e all'etichettatura basate su regole.
Prima di iniziare, voglio sottolineare che focalizzerò l'attenzione sulla spiegazione delle cose minime da fare per riprodurre il risultato desiderato: ciò 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, questa soluzione funziona solo se si assume che il 0
grado sia Nord anziché Sud (se 0
è Sud, invece, sarebbe sufficiente sommare un 180
valore ogni volta che appare un '90' in formule che si occupano di angoli, ad esempio cos(radians(90))
diventerebbe cos(radians(180 + 90))
). Ho preferito farlo solo per dare una soluzione più generale.
Messa in piega
Renderemo i punti con a Single symbol
e ricorrendo a uno Simple Marker
e tre Geometry generator
livelli simbolo:
Nell'ulteriore spiegazione, seguirò lo stesso ordine dei simboli nell'immagine sopra.
1) Indicatore semplice
Ho scelto un simbolo predefinito di una stella nera (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 il Geometry generator
tipo:
Inserisci questa espressione nel Expression
campo:
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
Abbiamo appena definito la prima linea che punta verso il punto da cui parte il settore della luce. Questa linea è lunga 1000 m ed è creata solo quando l'angolo di apertura della luce del settore non è un angolo arrotondato (questo accade per evitare che la linea si spezzerebbe un intero cerchio).
3) Geometry Generator No. 2
Come sopra ma, in questo passaggio, è necessario utilizzare questa espressione:
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
Abbiamo appena definito la prima linea che punta verso il punto in cui finisce il settore leggero. Questa linea è lunga 1000 m ed è creata solo quando l'angolo di apertura della luce del settore non è un angolo arrotondato (questo accade per evitare che la linea si spezzerebbe un intero cerchio).
4) Geometry Generator No. 3
Inserisci questa espressione nel Expression
campo:
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
Abbiamo appena definito l'arco tra i punti iniziale e finale del settore chiaro (si noti che 2000
è un valore arbitrario perché sto cercando di creare un poligono per intersecare il confine del cerchio con un raggio di 900 m).
Inoltre, dobbiamo impostare il colore memorizzato nel "VARIS"
campo. Per fare ciò, dobbiamo specificarlo con un'espressione personalizzata. Segui la freccia nell'immagine qui sotto:
e quindi digitare questa espressione dopo aver fatto clic sul Edit...
pulsante:
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
Si noti che, per questo layer di simboli, ho creato due righe: la riga superiore definisce il colore da utilizzare (in effetti ho impostato l'espressione personalizzata per questa), mentre quella inferiore è utile per definire un bordo nero (avrà una larghezza maggiore di quella della linea superiore). Ricorda anche di impostare Flat
come Cap style
per entrambe le linee per evitare sovrapposizioni di colore.
etichettatura
1) Impostazione delle etichette
Vai a Layer Properties
> Labels
e, come al solito, segui le frecce rosse:
e quindi digitare questa espressione:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
Abbiamo appena definito la regola del colore utilizzando il valore memorizzato nel "VARIS"
campo.
2) Impostazione del posizionamento per le etichette
Seleziona l' Placement
opzione nel Labels
menu e seleziona Offset from point
.
Quindi, con riferimento all'immagine seguente:
segui la freccia rossa e digita questa espressione:
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
Quindi, segui la freccia verde e digita questa espressione:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Risultato finale
Se hai eseguito correttamente le attività precedenti, dovresti essere in grado di ottenere questo risultato:
indennità
Dato che i parametri minori erano troppi per essere completamente coperti da questa risposta, ho allegato lo stile qui : puoi aprire questo codice con qualsiasi editor di testo e salvarlo come file QGIS Layer Style (cioè con .qml
un'estensione).
Lo stile sopra è stato creato usando QGIS 2.18.4 (deve avere lo stesso nome dello shapefile che stai usando).