Affichage des symboles d'antenne sur la carte: symboles ou entités ponctuelles (polygones)

12

Je souhaite afficher un réseau cellulaire sur une carte. Les données d'entrée sont un fichier .csv où chaque chaîne est un secteur cellulaire. Les attributs sont: le secteur id, ses coordonnées, son azimut et un angle de largeur de faisceau d'antenne.

Les valeurs de largeur de faisceau d'antenne se situent dans une plage de 30 à 360 degrés. La largeur du faisceau de l'antenne 360 ​​signifie qu'elle doit être indiquée sur la carte comme un cercle. Les antennes avec d'autres largeurs de faisceau doivent être représentées comme des secteurs avec des angles d'ouverture appropriés.

entrez la description de l'image ici

Est-il possible de montrer les antennes en utilisant uniquement des symboles? Je sais comment créer mon propre symbole SVG et j'espère trouver comment le faire pivoter en fonction de l'azimut. Mais existe-t-il un moyen d'appliquer une largeur de faisceau d'antenne variable en fonction de sa valeur d'attribut de 30 à 360 degrés?

Je pense que les symboles sont le meilleur moyen de dessiner les antennes en raison de la visualisation dynamique sur la carte en fonction de l'échelle de vue, si cela est possible dans QGIS.

Bien sûr, la tâche peut être résolue en dessinant des polygones appropriés en tant qu'entité de couche, mais ce serait une solution de contournement.

E Bobrov
la source
Vous devez donc dessiner l'arc dans la bonne direction, ce qui est différent pour chaque site?
Nathan W
Pas du tout si je comprends bien. Ce doit être un secteur de cercle (ou le cercle entier en cas d'ouverture de faisceau = 360) comme indiqué sur l'image.
E Bobrov
Oui, c'est ce que je veux dire.
Nathan W
OK je vois. Parlant en général, le symbole d'arc n'est pas strictement nécessaire. Les principaux attributs sont l'azimut et la largeur de faisceau. Je peux utiliser n'importe quel symbole pour dessiner les antennes, pas seulement un arc.
E Bobrov
J'ai probablement trouvé l'exemple qui peut aider: Créer des types de calques de symboles personnalisés . Mais je ne suis pas sûr. Donc, quelqu'un a essayé de créer votre propre classe de couches de symboles qui dessine par exemple la direction de chaque couche en fonction de son attribut (c'est-à-dire l'azimut d'antenne dans les mots de l'image ci-dessus)?
E Bobrov

Réponses:

7

Il y a quelques jours, un nouveau plugin a été ajouté à QGIS appelé Wedge Buffer Processing Algorithm . Cela semble être intéressant.

Comme son nom l'indique, c'est un algorithme de traitement, vous devrez donc l'exécuter à partir de la boîte à outils de traitement. Pas encore eu l'occasion de l'essayer.

Il crée des secteurs de cercles - comme un tampon circulaire normal, mais l'angle et le rayon du coin peuvent être définis à l'aide des valeurs de champ.

La documentation et les captures d'écran sont visibles sur la page github

Steven Kay
la source
10

Si vous ne souhaitez utiliser que la symbologie, je vous propose une solution inspirée de ma réponse à une question similaire: Créer des secteurs de lumières dans QGIS? .


En suivant une approche similaire et en supposant que vous travaillez sur un CRS projeté (à la place, si vous utilisez un système de coordonnées géographiques, voir la note à la fin de la réponse), je tiens à souligner que je concentrerai l'attention sur l'explication des choses minimales à faire pour reproduire le résultat souhaité: cela signifie que certains autres paramètres mineurs (comme les tailles, les largeurs, etc.) doivent être facilement ajustés par vous pour mieux répondre à vos besoins.

De plus, je suppose que "AZIMUTH"c'est le champ qui stocke les valeurs d'azimut et "BEAMWIDTH"c'est le champ qui stocke les largeurs de faisceau d'antenne.

Solution

Nous rendrons les points avec un Single symbolet en répétant une Simple Markeret deux Geometry generatorcouches de symboles:

entrez la description de l'image ici

Dans l'explication supplémentaire, je suivrai le même ordre des symboles dans l'image ci-dessus.

1) Marqueur simple

J'ai choisi un symbole par défaut d'un cercle rouge (c'est la partie la plus facile de ce tutoriel), ayant une taille de 3 mm et une largeur de 0,4 mm.

2) Générateur de géométrie n ° 1

Ajoutez une nouvelle couche de symboles et sélectionnez le Geometry generatoret les LineString / MultiLineStringtypes:

entrez la description de l'image ici

Insérez cette expression dans le Expressionchamp:

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

Nous venons de définir la flèche qui pointe vers l'ensemble d'azimut (pour créer la flèche, n'oubliez pas de sélectionner le Arrowtype de couche de symboles sous l' Lineoption dans le menu principal des symboles). Veuillez noter que cela 300représente une distance en mètres et que c'est une valeur arbitraire, alors n'hésitez pas à la modifier selon vos besoins.

3) Générateur de géométrie n ° 2

Ajoutez une nouvelle couche de symboles et sélectionnez le Geometry generatortype et les Polygon / MultiPolygontypes:

entrez la description de l'image ici

Insérez cette expression dans le Expressionchamp:

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

Nous venons de définir le secteur. Veuillez noter que 200et 2000représentent des distances en mètres et ce sont des valeurs arbitraires parce que j'essaie de créer un polygone à intersecter avec le cercle ayant un rayon de 200 m, alors n'hésitez pas à les changer selon vos besoins.

Résultat final

Si vous effectuez correctement les tâches précédentes, vous devriez pouvoir obtenir des résultats comme ceux-ci (les étiquettes sont ajoutées en dehors de cette solution et elles ne devraient expliquer que mieux le contexte):

entrez la description de l'image ici

Remarque

Si vous utilisez un système de coordonnées géographiques , c'est-à-dire si vous avez affaire à des degrés et non à des distances, il devrait suffire d'utiliser les valeurs appropriées lorsque j'ai utilisé une distance dans les formules précédentes. Les distances que j'ai utilisées sont:

  • 300 m (voir Générateur de géométrie n ° 1);
  • 200 m (voir Générateur de géométrie n ° 2);
  • 2000 m (voir Générateur de géométrie n ° 2);

vous pouvez donc le remplacer par d'autres valeurs arbitraires exprimées en degrés (par exemple 0.0002, 0.002et ainsi de suite).

Prime

J'ai attaché le style ici : vous pouvez ouvrir ce code avec n'importe quel éditeur de texte et l'enregistrer en tant que fichier de style de couche QGIS (c'est-à-dire avec une .qmlextension).

Le style ci-dessus a été créé à l'aide de QGIS 2.18.4 (il doit avoir le même nom que le fichier de formes que vous utilisez).

mgri
la source
Cherchiez-vous cette solution? Est-ce que ça marche?
mgri
Votre soluton résout totalement le cas décrit dans le sujet! Je l'ai mis en œuvre et j'ai compris que mon propre cas réel était légèrement différent. Désolé c'est ma faute.
E Bobrov
1) La densité de mes secteurs sur la carte est différente, c'est-à-dire qu'en cas de courtes distances entre secteurs, la distance définie dans le code donnera beaucoup de secteurs qui se chevauchent, changer le zoom de la carte ne serait pas utile, donc ce sera plutôt difficile pour lire la carte. Mais en cas de longues distances entre secteurs, les secteurs montrés seront très petits et peut-être difficiles à lire la carte. L'utilisation de symboles uniques est exempte de ce problème, leurs échelles changent avec un zoom sur la carte.
E Bobrov
2) Et il y a des distorsions de largeur de faisceau: la largeur de faisceau à 360 degrés ressemble à des ellipses, des secteurs avec des azimuts différents mais la même largeur de faisceau ne ressemble pas à des secteurs avec des largeurs de faisceau équivalentes. Est-ce parce que j'utilise le système de coordonnées géographiques? Vous maintenant, différents angles de longitude / latitude représentent une distance différente entre les points de la terre. La solution devait donc être localisée dans les zones terrestres où se trouvent les secteurs.
E Bobrov
Quoi qu'il en soit, votre solution et la référence pour une réponse similaire "Créer des lumières de secteur dans QGIS?" m'a aidé à voir certaines fonctionnalités utiles. Merci encore.
E Bobrov
4

Bravo à mgri.

Dans notre couche de test, tout s'est bien passé. Dans une couche de production, après deux / trois heures, j'ai réussi à localiser un problème avec $ geometry . Avait exporté une couche de points à partir d'une plate-forme, n'a pas pris note, mais c'était MultiPoint . Cela semblait causer des problèmes: la flèche n'était pas dessinée; et curieusement, seuls les points calculés ont fait le polygone des cercles.

Une autre chose est que j'utilise un rayon variable . (Je ne sais pas si c'est le bon mot dans ce cas, vous pouvez également le nommer «longueur de faisceau» ou autre).

Voici ce que j'utilise maintenant, avec une couche de type géométrie MultiPoints (alors qu'en fait toutes les fonctionnalités sont un seul point), et cela fonctionne pour moi dans QGis 2.18.3

Expression de la flèche Aucune flèche 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

Expression de polygone

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
jbostoen
la source
Ma réponse proposait une approche générale: comme il y avait beaucoup de variables impliquées dans le problème, il était tout à fait impossible de créer une procédure unique pour résoudre une situation. Donc, merci de le pointer et de proposer une approche avec les fonctionnalités MultiPoint, cela aidera sûrement quelqu'un à l'avenir.
mgri
1

J'ai été doué d'une solution partielle sur le Web sans plugins supplémentaires, juste qgis hors de la boîte. Il n'affiche pas la largeur de faisceau de l'antenne, il suffit de faire pivoter un marqueur simple dans la bonne direction: utilisez un marqueur simple et faites-le pivoter avec un azimut d'antenne + 180 degrés (Propriétés du calque> Simbol simple-> Marqueur-> Marqueur simple-> triangle-> rotation-> modifier -> tapez <180 + "antenne azimut"> dans le champ d'expression. Et définissez également Top dans le champ Point d'ancrage du marqueur). L'utilisation de <180 + "azimut d'antenne"> est nécessaire en raison de la direction inappropriée du marqueur triangulaire simple intégré. Sinon, la direction de l'antenne sera incorrecte.

E Bobrov
la source