Mostrando símbolos de antena no mapa: símbolos de pontos ou recursos (polígonos)


12

Quero mostrar uma rede celular em um mapa. Os dados de entrada são um arquivo .csv em que cada sequência é um setor celular. Os atributos são: ID do setor, suas coordenadas, seu azimute e um ângulo de largura do feixe da antena.

Os valores da largura do feixe da antena variam de 30 a 360 graus. A largura do feixe de 360 ​​antenas significa que ele deve ser mostrado no mapa como um círculo. Antenas com outras larguras de feixe devem ser mostradas como setores com ângulos de abertura apropriados.

insira a descrição da imagem aqui

É possível mostrar as antenas usando apenas símbolos? Eu sei como criar meu próprio símbolo SVG e espero descobrir como girá-lo de acordo com o azimute. Mas existe alguma maneira de aplicar a largura variável do feixe da antena de acordo com seu valor de atributo de 30 a 360 graus?

Eu acho que os símbolos são a melhor maneira de desenhar as antenas por causa da visualização dinâmica no mapa de acordo com a escala de visão, se isso for possível no QGIS.

Obviamente, a tarefa pode ser resolvida desenhando polígonos apropriados como um recurso de camada, mas isso seria uma solução alternativa.


Então você precisa desenhar o arco na direção certa, diferente para cada site?
22716 Nathan W

Nem um pouco Se eu entendi direito. Ele deve ser um setor do círculo (ou o círculo inteiro no caso de largura de feixe = 360), conforme mostrado na figura.
E Bobrov

Sim, é isso que eu quero dizer.
Nathan W

OK eu vejo. Falando em geral, o símbolo do arco não é estritamente necessário. Os principais atributos são azimute e largura de feixe. Eu posso usar qualquer símbolo para desenhar as antenas, não apenas um arco.
E Bobrov

Provavelmente encontrei o exemplo que pode ajudar: Criando tipos de camadas de símbolos personalizados . Mas não tenho certeza. Então, alguém tentou criar sua própria classe de camadas de símbolos que desenha, por exemplo, a direção de cada camada, dependendo do seu atributo (ou seja, azimute da antena nas palavras da figura acima)?
E Bobrov

Respostas:


7

Alguns dias atrás, um novo plugin foi adicionado ao QGIS chamado Wedge Buffer Processing Algorithm . Parece que pode ser do seu interesse.

Como o nome sugere, é um algoritmo de processamento, então você precisará executá-lo na caixa de ferramentas de processamento. Ainda não tive a chance de experimentá-lo.

Ele cria setores de círculos - como um buffer circular normal, mas o ângulo e o raio da cunha podem ser definidos usando valores de campo.

Documentação e capturas de tela podem ser vistas na página do github


10

Se você deseja usar apenas a simbologia, proponho uma solução inspirada na minha resposta de uma pergunta semelhante: Criando luzes do setor no QGIS? .


Seguindo uma abordagem semelhante, e supondo que você esteja trabalhando em um CRS projetado (em vez disso, se estiver usando um sistema de coordenadas geográficas, veja a nota no final da resposta), quero sublinhar que vou focar a atenção na explicação das coisas mínimas a serem executadas para reproduzir o resultado desejado: isso significa que alguns outros parâmetros menores (como tamanhos, larguras etc.) devem ser facilmente ajustados por você para melhor atender às suas necessidades.

Além disso, eu assumo que "AZIMUTH"é o campo que armazena os valores de azimute e "BEAMWIDTH"é o campo que armazena as larguras de feixe da antena.

Solução

Renderizaremos os pontos com Single symbolae recorrendo a uma Simple Markere duas Geometry generatorcamadas de símbolos:

insira a descrição da imagem aqui

Na explicação adicional, seguirei a mesma ordem dos símbolos na imagem acima.

1) Marcador Simples

Eu escolhi um símbolo padrão de um círculo vermelho (essa é a parte mais fácil deste tutorial), com um tamanho de 3 mm e uma largura de 0,4 mm.

2) Gerador de geometria n ° 1

Adicione uma nova camada de símbolo e selecione Geometry generatoros LineString / MultiLineStringtipos e:

insira a descrição da imagem aqui

Insira esta expressão no Expressioncampo:

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

Acabamos de definir a seta que aponta para o conjunto de azimute (para criar a seta, lembre-se de selecionar o Arrowtipo de camada de símbolo sob a Lineopção no menu principal do símbolo). Observe que isso 300representa uma distância em metros e é um valor arbitrário; portanto, fique à vontade para alterá-lo de acordo com suas necessidades.

3) Gerador de Geometria No. 2

Adicione uma nova camada de símbolo e selecione o Geometry generatortipo e os Polygon / MultiPolygontipos:

insira a descrição da imagem aqui

Insira esta expressão no 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 o setor. Observe que 200e 2000representa distâncias em metros e são valores arbitrários, porque estou tentando criar um polígono para cruzar com o círculo com um raio de 200 m, portanto, fique à vontade para alterá-los de acordo com suas necessidades.

Resultado final

Se você executar corretamente as tarefas anteriores, poderá obter resultados como estes (os rótulos são adicionados além desta solução e devem explicar melhor apenas o contexto):

insira a descrição da imagem aqui

Nota

Se você estiver usando um Sistema de coordenadas geográficas , ou seja, se estiver lidando com graus e não com distâncias, deve ser suficiente usar os valores adequados quando usei uma distância nas fórmulas anteriores. As distâncias que usei são:

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

assim você pode substituí-lo com outros valores arbitrários expressas em graus (por exemplo, 0.0002, 0.002e assim por diante).

Bônus

Anexei o estilo aqui : você pode abrir esse código com qualquer editor de texto e salvá-lo como um arquivo de estilo de camada QGIS (ou seja, com uma .qmlextensão).

O estilo acima foi criado usando o QGIS 2.18.4 (ele deve ter o mesmo nome do shapefile que você está usando).


Você estava procurando esta solução? Funciona?
Mgri

Sua solução resolve totalmente o caso descrito no tópico! Eu o implementei e entendi que meu próprio caso real é um pouco diferente. Desculpe, a culpa é minha.
E Bobrov

1) A densidade dos meus setores no mapa é diferente, ou seja, no caso de distâncias curtas entre os setores, a distância definida no código fará com que muitos setores se sobreponham, alterar o zoom do mapa não ajudaria, por isso será bastante difícil para ler o mapa. Porém, nos casos de longas distâncias entre setores, os setores serão muito pequenos e talvez difíceis de ler o mapa. O uso de símbolos únicos está livre desse problema, suas escalas mudam com o zoom do mapa.
E Bobrov

2) E existem distorções da largura de feixe: a largura de feixe em 360 graus se parece com elipses, setores com azimutes diferentes, mas a mesma largura de feixe não se parece com setores com larguras de feixe equivalentes. É porque estou usando o Sistema de Coordenadas Geográficas? Agora, diferentes ângulos de longitude / latitude representam diferentes distâncias entre os pontos da Terra. Portanto, a solução precisava ser localizada nas áreas da Terra onde os setores estão localizados.
E Bobrov

Enfim, sua solução e a referência para uma resposta semelhante "Criando luzes do setor no QGIS?" me ajudou a ver algumas funcionalidades úteis. Mais uma vez obrigado.
E Bobrov

4

Muitos elogios para mgri.

Em nossa camada de teste, tudo funcionou sem problemas. Em uma camada de produção, depois de duas / três horas, consegui rastrear um problema com $ geometry . Tinha exportado uma camada de pontos de uma plataforma, não percebeu, mas era o MultiPoint . Isso parecia causar problemas: a flecha não estava desenhada; e estranhamente apenas os pontos calculados formavam o polígono dos círculos.

Outra coisa é que estou usando um raio variável . (não tenho certeza se é a palavra certa nesse caso, você também pode chamá-lo de 'comprimento do feixe' ou o que for).

Aqui está o que estou usando agora, com uma camada de tipo de geometria MultiPoints (embora, de fato, todos os recursos sejam um único ponto), e funcione para mim no QGis 2.18.3

Expressão da seta Nenhuma seta se 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

Expressão de 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

Minha resposta propôs uma abordagem geral: como havia muitas variáveis ​​envolvidas no problema, era praticamente impossível criar um procedimento único para resolver qualquer situação. Portanto, obrigado por apontá-lo e propor uma abordagem com os recursos do MultiPoint, certamente ajudará alguém no futuro.
MGRI

1

Eu fui presenteado com uma solução parcial na web sem nenhum plug-in adicional, apenas qgis fora da caixa. Ele não mostra a largura do feixe da antena, basta girar o marcador simples na direção certa: use o marcador simples e gire-o com azimute da antena + 180 graus (Propriedades da camada> Simbol único-> Marcador-> Marcador simples-> triângulo-> rotação-> editar -> digite <180 + "azimute da antena"> no campo de expressão e defina Top no campo do ponto de ancoragem do marcador). O uso de <180 + "antena azimute"> é necessário devido à direção inadequada do marcador de triângulo simples incorporado. Caso contrário, mostrará uma direção incorreta da antena.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.