Mostrar símbolos de antena en el mapa: símbolos de puntos o entidades (polígonos)


12

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: identificación del sector, sus coordenadas, su acimut y un ángulo del ancho del haz de la antena.

Los valores de ancho del haz de la antena están en un rango de 30 a 360 grados. El ancho del haz de antena de 360 ​​significa que debe mostrarse en el mapa como un círculo. Las antenas con otros anchos de haz deben mostrarse como sectores con ángulos de apertura apropiados.

ingrese la descripción de la imagen aquí

¿Es posible mostrar las antenas usando solo símbolos? Sé cómo crear mi propio símbolo SVG y espero encontrar cómo rotarlo de acuerdo con el acimut. Pero, ¿hay alguna forma de aplicar un ancho de haz de 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 con la escala de visión, si esto es posible en QGIS.

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


¿Entonces necesita dibujar el arco en la dirección correcta que es diferente para cada sitio?
Nathan W

En absoluto si lo entiendo correctamente. Debe ser un sector de círculo (o todo el círculo en caso de ancho de haz = 360) como se muestra en la imagen.
E Bobrov

Sí, eso es lo que quiero decir.
Nathan W

OK veo. Hablando en general, el símbolo de arco no es estrictamente necesario. Los atributos principales son acimut y ancho de haz. Puedo usar cualquier símbolo para dibujar las antenas, no solo un arco.
E Bobrov

Probablemente he encontrado el ejemplo que puede ayudar: Crear tipos de capas de símbolos personalizados . Pero no estoy seguro. Entonces, ¿alguien trató de crear su propia clase de capa de símbolo que dibuje, por ejemplo, la dirección de cada capa dependiendo de su atributo (es decir, el acimut de la antena en las palabras de la imagen de arriba)?
E Bobrov

Respuestas:


7

Hace unos días se agregó un nuevo complemento a QGIS llamado Algoritmo de procesamiento de búfer en cuña . Parece que podría ser de interés.

Como su nombre indica, es un algoritmo de procesamiento, por lo que deberá ejecutarlo desde la caja de herramientas de procesamiento. Sin embargo, aún no tuve 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 se pueden establecer utilizando valores de campo.

La documentación y las capturas de pantalla se pueden ver en la página de Github


10

Si desea utilizar solo la simbología, le propongo una solución inspirada en mi respuesta de una pregunta similar: ¿ Crear luces de sector en QGIS? .


Siguiendo un enfoque similar, y suponiendo que está trabajando en un CRS proyectado (en cambio, si está utilizando un Sistema de coordenadas geográficas, vea la nota al final de la respuesta), quiero subrayar que enfocaré la atención en la explicación de las cosas mínimas para reproducir el resultado deseado: esto significa que algunos otros parámetros menores (como tamaños, anchos, etc.) deben ser ajustados fácilmente por usted para adaptarse mejor a sus necesidades.

Además, supongo que ese "AZIMUTH"es el campo que almacena los valores de acimut y "BEAMWIDTH"es el campo que almacena los anchos del haz de la antena.

Solución

Representaremos los puntos con Single symbolay recurriendo a una Simple Markery dos Geometry generatorcapas de símbolos:

ingrese la descripción de la imagen aquí

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 un círculo rojo (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 Geometry generatorlos LineString / MultiLineStringtipos y:

ingrese la descripción de la imagen aquí

Inserte esta expresión en el Expressioncampo:

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 Arrowtipo de capa de símbolo en la Lineopción del menú de símbolo principal). Tenga en cuenta que 300representa una distancia en metros y es un valor arbitrario, así que siéntase libre de cambiarlo según sus necesidades.

3) Geometry Generator No. 2

Agregue una nueva capa de símbolo y seleccione el Geometry generatortipo y los Polygon / MultiPolygontipos:

ingrese la descripción de la imagen aquí

Inserte esta expresión en el Expressioncampo:

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 eso 200y 2000represente distancias en metros y son valores arbitrarios porque estoy tratando de crear un polígono para intersecar con el círculo que tiene un radio de 200 m, así que siéntase libre de cambiarlos según sus necesidades.

Resultado final

Si realiza correctamente las tareas anteriores, debería poder obtener resultados como estos (las etiquetas se agregan aparte de esta solución y solo deberían explicar mejor el contexto):

ingrese la descripción de la imagen aquí

Nota

Si está utilizando un Sistema de coordenadas geográficas , es decir, si está tratando con grados y no con distancias, debería ser suficiente con los valores adecuados cuando utilicé una distancia en las fórmulas anteriores. Las distancias que utilicé son:

  • 300 m (ver Geometry Generator No. 1);
  • 200 m (ver Geometry Generator No. 2);
  • 2000 m (ver Geometry Generator No. 2);

por lo que puede reemplazarlo con otros valores arbitrarios expresadas en grados (por ejemplo, 0.0002, 0.002y así sucesivamente).

Prima

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 .qmlextensión).

El estilo anterior se creó con QGIS 2.18.4 (debe tener el mismo nombre del archivo de forma que está utilizando).


¿Estabas buscando esta solución? ¿Funciona?
mgri

¡Su solución resuelve totalmente el caso descrito en el tema! Lo implementé y entendí que mi propio caso real es ligeramente diferente. Lo siento, es mi culpa.
E Bobrov

1) La densidad de mis sectores en el mapa es diferente, es decir, en caso de distancias cortas entre sectores, la distancia definida en el código se superpondrá a muchos sectores, cambiar el zoom del mapa no ayudaría, por lo que será bastante difícil para leer el mapa Pero en casos de largas distancias entre sectores, los sectores mostrados serán muy pequeños y quizás difíciles de leer en el mapa. El uso de símbolos individuales está libre de ese problema, sus escalas cambian con un zoom del mapa.
E Bobrov

2) Y hay distorsiones de ancho de haz: el ancho de haz de 360 ​​grados se parece a elipses, sectores con diferentes acimutes pero el mismo ancho de haz no se parece a sectores con anchos de haz equivalentes. ¿Es porque estoy usando el Sistema de coordenadas geográficas? Ahora, diferentes ángulos de longitud / latitud representan diferentes distancias entre puntos en la tierra. Por lo tanto, la solución necesitaba ser localizada en las áreas de la Tierra donde se encuentran los sectores.
E Bobrov

De todos modos, su solución y la referencia para una respuesta similar "¿Crear luces de sector en QGIS?" me ayudó a ver algunas funcionalidades útiles. Gracias de nuevo.
E Bobrov

4

Grandes felicitaciones a mgri.

En nuestra capa de prueba, todo funcionó sin problemas. En una capa de producción, después de dos o tres horas, logré localizar un problema con $ geometry . Había estado exportando una capa de puntos desde una plataforma, no lo noté, pero era MultiPoint . Esto parecía causar problemas: la flecha no estaba dibujada; y curiosamente solo los puntos calculados formaron el polígono de los círculos.

Otra cosa es que estoy usando un radio variable . (no estoy seguro de si es la palabra correcta en este caso, también podría llamarlo 'longitud del haz' o lo que sea).

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

Expresión de flecha Sin flecha si 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 poligonal

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

Mi respuesta propuso un enfoque general: dado que había muchas variables involucradas en el problema, era bastante imposible crear un procedimiento único para resolver cualquier situación. Entonces, gracias por señalarlo y proponer un enfoque con características MultiPoint, seguramente ayudará a alguien en el futuro.
mgri

1

Me regalaron una solución parcial en la web sin complementos adicionales, solo qgis fuera de la caja. No muestra el ancho del haz de la antena, solo gire el marcador simple en la dirección correcta: use un marcador simple y gírelo con acimut de antena + 180 grados (Propiedades de capa> Simbol simple-> Marcador-> Marcador simple-> triángulo-> rotación-> editar -> escriba <180 + "antena azimut"> en el campo de expresión. Y también establezca Top en el campo Punto de anclaje del marcador). El uso de <180 + "antena azimut"> 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.