12 votos

Mostrar los símbolos de las antenas en el mapa: símbolos de puntos o características (polígonos)

Quiero mostrar una red celular en un mapa. Los datos de entrada son un archivo .csv donde cada cadena es un sector celular. Los atributos son: el id del sector, sus coordenadas, su acimut y un ángulo del ancho del haz de la antena.

Los valores de la anchura del haz de la antena están en un rango de 30 a 360 grados. Una anchura de haz de antena de 360 grados significa que debe mostrarse en el mapa como un círculo. Las antenas con otras anchuras de haz deben mostrarse como sectores con los ángulos de apertura adecuados.

enter image description here

¿Es posible mostrar las antenas utilizando sólo símbolos? Sé cómo crear mi propio símbolo SVG y espero encontrar la forma de girarlo según el acimut. Pero, ¿hay alguna manera de aplicar la anchura del haz de la antena variable de acuerdo con su valor de atributo de 30 a 360 grados?

Creo que los símbolos son la mejor manera de dibujar las antenas debido a la visualización dinámica en el mapa de acuerdo a la escala de vista, si esta forma es posible en QGIS.

Por supuesto, la tarea puede ser resuelta dibujando los polígonos apropiados como una característica de la capa, pero eso sería una solución de trabajo.

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.

11voto

Geoffrey Puntos 228

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:

enter image description here

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:

enter image description here

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:

enter image description here

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):

enter image description here

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).

7voto

Mat Puntos 196

Hace unos días se añadió un nuevo plugin a QGIS llamado Algoritmo de procesamiento del búfer de la cuña . Esto parece que puede ser de interés.

Como su nombre indica, es un algoritmo de procesamiento, por lo que tendrá que ejecutarlo desde la caja de herramientas de procesamiento. Sin embargo, aún no he tenido la oportunidad de probarlo.

Crea sectores de círculos, como un búfer circular normal, pero el ángulo y el radio de la cuña pueden establecerse mediante valores de campo.

La documentación y las capturas de pantalla pueden verse en el página de github

4voto

user107621 Puntos 1

Un gran aplauso para mgri.

En nuestra capa de prueba, todo funcionó sin problemas. En una capa de producción, después de dos/tres horas, conseguí localizar un problema con $geometría . Había estado exportando una capa de puntos desde una plataforma, no se dio cuenta, pero fue MultiPoint . Esto parecía causar problemas: la flecha no se dibujaba; y extrañamente sólo el calculado puntos formaron el polígono de los círculos.

Otra cosa es que estoy usando una variable radio . (no estoy seguro de que sea la palabra correcta en este caso, también podría llamarse "longitud del rayo" o lo que sea).

Esto es lo que estoy usando ahora, con una capa de tipo de geometría MultiPoints (mientras que en realidad todas las características son un solo punto), y funciona para mí en QGis 2.18.3

Expresión de la flecha No hay flecha si es de 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

Expresión del polígono

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

1voto

Matias Heikkilä Puntos 382

Me regalaron una solución parcial en la web sin ningún plugin adicional, sólo qgis fuera de la caja. No muestra la anchura del haz de la antena, sólo tiene que girar el marcador simple en la dirección correcta: utilizar el marcador simple y girarlo con el acimut de la antena + 180 grados (Propiedades de la capa>Simbolo simple->Marcador->Marcador simple->triángulo->rotación->editar->escribir <180 + "acimut de la antena"> en el campo de expresión. Y también poner Top en el campo Anchor point del marcador). El uso de <180 + "azimut de la antena"> es necesario debido a la dirección inapropiada del marcador de triángulo simple incrustado. De lo contrario, mostrará una dirección de antena incorrecta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X