EDITAR Edité la respuesta para manejar situaciones particulares (debido a valores de ángulo específicos) y para no mostrar las líneas punteadas cuando se define un ángulo redondo.
Propongo una solución recurriendo solo a la simbología y el etiquetado basados en reglas.
Antes de comenzar, quiero subrayar que enfocaré la atención en la explicación de las cosas mínimas para reproducir el resultado deseado: esto significa que usted debe ajustar fácilmente otros parámetros menores (como tamaños, anchos, etc.) para adaptarse mejor a sus necesidades.
Además, esta solución solo funciona si supone que el 0
grado es Norte en lugar de Sur (si 0
es Sur, en cambio, sería suficiente sumar un 180
valor cada vez que aparezca un '90' en las fórmulas que tratan con ángulos, por ejemplo, cos(radians(90))
se convertiría en cos(radians(180 + 90))
). Preferí hacer esto solo por dar una solución más general.
Estilo
Representaremos los puntos con Single symbol
ay recurriendo a una Simple Marker
y tres Geometry generator
capas de símbolos:
En la explicación adicional, seguiré el mismo orden de los símbolos en la imagen de arriba.
1) Marcador simple
Elegí un símbolo predeterminado de una estrella negra (esta es la parte más fácil de este tutorial), que tiene un tamaño de 3 mm y un ancho de 0.4 mm.
2) Geometry Generator No. 1
Agregue una nueva capa de símbolo y seleccione el Geometry generator
tipo:
Inserte esta expresión en el 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
Acabamos de definir la primera línea que apunta hacia el punto desde donde comienza el sector de la luz. Esta línea tiene 1000 m de largo y se crea solo cuando el ángulo de apertura de la luz del sector no es un ángulo redondo (esto sucede para evitar que la línea rompa un círculo completo).
3) Geometry Generator No. 2
Igual que el anterior pero, en este paso, debe usar esta expresión:
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
Acabamos de definir la primera línea que apunta hacia el punto donde termina el sector de la luz. Esta línea tiene 1000 m de largo y se crea solo cuando el ángulo de apertura de la luz del sector no es un ángulo redondo (esto sucede para evitar que la línea rompa un círculo completo).
4) Geometry Generator No. 3
Inserte esta expresión en el 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
Acabamos de definir el arco entre los puntos inicial y final del sector de la luz (tenga en cuenta que 2000
es un valor arbitrario porque estoy tratando de crear un polígono para intersecar con el límite del círculo que tiene un radio de 900 m).
Además, necesitamos establecer el color que se almacena en el "VARIS"
campo. Para hacer esto, necesitamos especificarlo con una expresión personalizada. Sigue la flecha en la imagen a continuación:
y luego escriba esta expresión después de hacer clic en el Edit...
botón:
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
Tenga en cuenta que, para esta capa de símbolo, creé dos líneas: la línea superior define el color que se usará (de hecho, configuro la expresión personalizada para esta), mientras que la inferior es útil para definir un borde negro (tendrá un ancho que es más grande que el de la línea superior). Recuerde también para establecer Flat
como Cap style
para ambas líneas para evitar cualquier color superpuestas.
Etiquetado
1) Establecer las etiquetas
Vaya a Layer Properties
> Labels
y, como siempre, siga las flechas rojas:
y luego escribe esta expresión:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
Acabamos de definir la regla de color utilizando el valor almacenado en el "VARIS"
campo.
2) Establecer la ubicación de las etiquetas
Seleccione la Placement
opción en el Labels
Menú y seleccione Offset from point
.
Luego, con referencia a la imagen a continuación:
siga la flecha roja y escriba esta expresión:
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
Luego, sigue la flecha verde y escribe esta expresión:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Resultado final
Si realizó correctamente las tareas anteriores, debería poder obtener este resultado:
Prima
Dado que los parámetros menores eran demasiados para estar completamente cubiertos en esta respuesta, he adjuntado el estilo aquí : puede abrir este código con cualquier editor de texto y guardarlo como un archivo de estilo de capa QGIS (es decir, con una .qml
extensión).
El estilo anterior se creó con QGIS 2.18.4 (debe tener el mismo nombre del archivo de forma que está utilizando).