Si quieres usar sólo simbología, te propongo una solución inspirada en mi respuesta a una pregunta similar: ¿Crear luces de sector en QGIS? .
Siguiendo un enfoque similar, y suponiendo que se está trabajando en un SIR proyectado (en cambio, si está utilizando un Sistema de Coordenadas Geográficas, vea la nota al final de la respuesta), quiero subrayar que centraré la atención en la explicación de las cosas mínimas que hay que hacer para reproducir el resultado deseado: esto significa que algunos otros parámetros menores (como tamaños, anchos y demás) deberían ser fácilmente ajustados por usted para adaptarse mejor a sus necesidades.
Además, asumo que "AZIMUTH"
es el campo que almacena los valores de acimut y "BEAMWIDTH"
es el campo que almacena los anchos de los haces de la antena.
Solución
Haremos los puntos con un Single symbol
y recurriendo a una Simple Marker
y dos Geometry generator
capas de símbolos:
En la explicación posterior, seguiré el mismo orden de los símbolos de la imagen anterior.
1) Marcador simple
Elegí un símbolo por defecto de un círculo rojo (esta es la parte más fácil de este tutorial), con un tamaño de 3 mm y un ancho de 0,4 mm.
2) Generador de geometría nº 1
Añade una nueva capa de símbolos y selecciona el Geometry generator
y el LineString / MultiLineString
tipos:
Inserte esta expresión en el Expression
campo:
make_line(
$geometry,
make_point($x + 300*cos(radians(90 - "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)
Acabamos de definir la flecha que apunta hacia el conjunto de acimut (para crear la flecha, recuerde seleccionar el Arrow
tipo de capa de símbolos bajo el Line
en el menú principal de símbolos). Tenga en cuenta que 300
representa una distancia en metros y es un valor arbitrario, así que siéntete libre de cambiarlo según tus necesidades.
3) Generador de geometría nº 2
Añade una nueva capa de símbolos y selecciona el Geometry generator
y el Polygon / MultiPolygon
tipos:
Inserte esta expresión en el Expression
campo:
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
Acabamos de definir el sector. Tenga en cuenta que 200
y 2000
representan las distancias en metros y son valores arbitrarios porque estoy tratando de crear un polígono que se intersecte con el círculo que tiene un radio de 200 m, así que siéntase libre de cambiarlos de acuerdo a sus necesidades.
Resultado final
Si realizas correctamente las tareas anteriores, deberías poder obtener resultados como estos (las etiquetas se añaden aparte de esta solución y sólo deben explicar mejor el contexto):
Nota
Si está utilizando un Sistema de coordenadas geográficas Es decir, si se trata de grados y no de distancias, debería bastar con utilizar los valores apropiados cuando utilicé una distancia en las fórmulas anteriores. Las distancias que utilicé son:
- 300 m (véase el generador de geometría nº 1);
- 200 m (véase el generador de geometría nº 2);
- 2000 m (véase el generador de geometría nº 2);
por lo que puede sustituirlo por otros valores arbitrarios expresados en grados (por ejemplo, 0.0002
, 0.002
etc.).
Bono
He adjuntado el estilo aquí puede abrir este código con cualquier editor de texto y guardarlo como un archivo de estilo de capa de QGIS (es decir, con un .qml
extensión).
El estilo anterior se creó con QGIS 2.18.4 (debe tener el mismo nombre que el archivo shape que está utilizando).
0 votos
Entonces, ¿hay que dibujar el arco en la dirección correcta, que es diferente para cada sitio?
0 votos
En absoluto, si lo he entendido bien. Debe ser un sector del círculo (o todo el círculo en caso de ancho de haz = 360) como se muestra en la imagen.
0 votos
Sí, eso es lo que quiero decir.
0 votos
Bien, ya veo. Hablando en general el símbolo del arco no es necesario estrictamente. Los atributos principales son el acimut y el ancho de haz. Puedo utilizar cualquier símbolo para dibujar las antenas no un arco solamente.
0 votos
Probablemente he encontrado el ejemplo que puede ayudar: Creación de tipos de capas de símbolos personalizados . Pero no estoy seguro. ¿Alguien ha intentado crear su propia clase de capa de símbolos que dibuje, por ejemplo, la dirección de cada característica de la capa en función de su atributo (es decir, el acimut de la antena en las palabras de la imagen anterior)?
0 votos
He visto que ya hay una respuesta aceptada aquí y quizás llego un poco tarde a la fiesta. Sin embargo, si usted prefiere una solución con la simbología sólo, por favor, echa un vistazo a mi respuesta.