segment
Objectif: Calculer l’orientation d’une sépulture c’est à dire l’angle qu’elle forme avec un axe Nord-Sud.
Le tout dans un Système de Coordonnées de Référence métrique (ici en Lambert 93) et en SQL (pour pouvoir être calculé grâce à la calculatrice de champs de QGis)…
L’exemple de ce tutoriel concerne une hypothétique sépulture mais il est bien évidemment valable pour toute autre polyligne: limites cadastrales, fossés d’enclos, etc
1) Un petit peu de théorie: retour au collège
Nous avons donc une sépulture représentée dans notre logiciel SIG préféré par une segment [AB]
2) Comme on le voit ci-dessus, ce segment [AB] est l’hypoténuse d’un triangle rectangle qui forme un angle α avec l’axe Nord-Sud [CA] pour côté adjacent et [CB] pour côté opposé.
3) Si l’on se rappelle de ses cours de collège ou lycée (ou que l’on a des collègues qui s’en souviennent mieux que nous…merci Ali), on est capable de calculer les trois angles d’un triangle rectangle si l’on connaît les longueurs des côtés dudit triangle. Et donc, de l’angle α grâce aux longueurs de son côté adjacent [CA] et de son côté opposé [CB].
Mais si, rappelez vous les rapports trigonométriques d’un triangle rectangle:
<< Dans un triangle rectangle, la tangente d’un angle aigu est le quotient du côté opposé à l’angle sur le côté adjacent à l’angle >>
autrement dit:
4) On pourra donc en déduire, la mesure de l’angle α grâce à une calculatrice scientifique quelconque avec la fonction inv tan ou un tableur avec la fonction ATAN.
5) Application dans QGis…
Revenons à nos moutons, ou plutôt notre macchabée…en tout cas la polyligne qui le représente:
– Nous devons donc calculer dans un premier temps les longueurs des côtés « imaginaires » [CB] et [CA]
=> Rien de plus simple puisque les longueurs des côtés [CB] et [CA] correspondent à la différence entre les valeurs en ordonnées et en abscisses des extrémités (comme expliqué dans le graphique ci-dessus):
CB = xB-xA et CA = yB-yA
=> Et cela tombe très bien puisque QGis est capable de récupérer les coordonnées x et y des deux extrémités d’une polyligne dans la calculatrice de champs grâce aux opérateurs SQL (géométrie) xat et yat:
xat(O) et yat(O) : coordonnées x et y du point de départ de la polyligne
xat(-1) et yat(-1) pour les coordonnées de fin de la polyligne
Note: Si ces coordonnées vous intéressent vous pouvez donc facilement les récupérer dans une nouvelle colonne de votre table attributaire.
– Nous avons donc les longueurs des côtés adjacent et opposé à l’angle α qui nous intéresse… reste a pouvoir calculer « l’inverse de la tangente »…
=> Encore une fois cela tombe très bien puisque QGis contient dans sa calculatrice de champs la fonction mathématique ATAN:
5) Et la formule magique est … ATAN ( (xat(0)-xat(-1))/(yat(0)-yat(-1)) )*180/3.1416
Alors on récapitule, on veut l’inverse de la tangente ATAN du quotient (/) du côté opposé à l’angle (xat(0)-xat(-1)) sur le côté adjacent à l’angle (yat(0)-yat(-1))
Attention: Le résultat étant en radians, pour le transformer en degrés le résultat doit être multiplié par 180 et divisé par PI d’où le *180/3.1416
6) ET voilà !
Il nous suffit donc de créer une nouvelle colonne dans la table attributaire de notre shapefile de polylignes (qui représentent les axes longitudinaux des sépultures dans cet exemple)
Puis dans la calculatrice de champs de taper la formule magique mathématique:
ATAN ( (xat(0)-xat(-1))/(yat(0)-yat(-1)) )*180/3.14159
Les résultats sont en degrés, les valeurs de 0° à 90° sont des orientations EST et les valeurs de 0° à -90° sont des orientations OUEST !!
Attention: La direction des polylignes n’est pas prise en compte les orientations seront donc comprises entre -90° (Plein Ouest) et 90° (plein Est) en passant par 0° (plein Nord)
7) ET PUIS LOG… (Jeu de mot pourri…)
Évidemment je ne suis pas le seul à avoir chercher à calculer l’orientation d’une polyligne et en cherchant encore un peu je suis tombé sur un plus fort que moi 😉 ICI qui permet de récupérer l’orientation en degrés (de 0° à 360°) .
Attention le point de départ de création de la polyligne et le point d’arrivée comptent pour le calcul. Dans le cas des sépultures par exemple les points doivent toujours être reliés dans le même sens, celui des pieds puis celui du crâne.
Bon allez je vous la donne cette formule:
(atan((xat(-1)-xat(0))/(yat(-1)-yat(0)))) * 180/3.14159 + (180 *(((yat(-1)-yat(0)) < 0) + (((xat(-1)-xat(0)) < 0 AND (yat(-1) - yat(0)) >0)*2)))
Le début de la formule est bien la même que la mienne (ça me rassure… et la suite permet d’ajouter soit 180 soit 360 au résultat obtenu par cette dernièreafin d’obtenir une orientation entre 0° et 360°.
Bonjour,
Félicitations pour ce blog, que je découvre.
Confronté il y a quelques années à la question de l’orientation des tombes (mais sous ArcGIS), j’avais mis en place une solution comparable, décrite par d’autres sur le forumSIG.
Le gros soucis, pour moi, avait été d’automatiser le « tracé » de l’orientation (ta ligne AB).
A l’époque, j’avais trouvé une solution qui marchait pas trop mal en définissant des rectangles externes au plus proche de la forme (avec l’outil HullRectangle), comme expliqué là :
http://soi.cnr.it/~archcalc/indice/Suppl_3/Suppl_3.pdf ; un peu de pub en passant, à modérer si tu veux)
J’ai changé de service depuis et travaille sous QGIS. As-tu réfléchi à (voire trouvé) une solution pour automatiser cette ligne ? Quant il y a plusieurs centaines de tombes, c’est un peu fastidieux à la main…
Vincent
Bonsoir et merci,
Pour le tracé automatique regarde du côté de l’extension Point2One de Goyo (qui en plus vient de passer sur le « repository » officiel de QGis) voire avec l’extension Points to Paths…
Au plaisir de te relire !
PS: mille merci pour le lien !! j’y étais et me rappelle bien d’un chantier plein de sépultures 😉 mais ne savais pas que c’était publié !
En fait j’avais pas compris… tu n’a pas deux points au départ mais des polygones… c’est ça ?
J’ai essayé avec
Menu Vecteur > Outils de géométrie > Polygones vers lignes
PUIS
Menu Vecteur > Outils de géométrie > Simplifier la géométrie … (avec une « Tolérance de simplification » de 0,5)
le résultat ne me parait pas très probant mais bon… faudrait tester les paramètres ou
voir avec un « plus petit rectangle englobant » version QGis..
C’est ça : j’ai au départ le dessin des contours des sépultures tracé d’après photo redressée. Par pure flemme, je n’ai pas voulu tracer à la main la ligne qui définit l’orientation des tombes. L’idée du rectangle enveloppant le polygone au plus proche est assez satisfaisant, parce que ses grands côtés sont grosso modo parallèle à la tombe (sauf forme très bizarre, bien entendu).
Y’a des outils sous ArcGIS qui tracent ce rectangle tout seul, d’autres qui donnent même directement son azimuth !
J’ai regardé rapidement : on doit pouvoir faire ce genre de rectangles sous R ou sous SpatiaLite, mais j’ai jamais joué avec pour le moment. Si je trouve une solution propre, je n’hésiterai pas à t’en faire part !
Bonjour Vincent,
je travaille sur la même chose sous Arcgis, des recherches sur google ne me font que perdre le fil plus !
pourriez vous m’orienter et me montrer d’où commencer ?
Salut,
Bon n’ayant pas le temps de me concentrer a cette question récurrente ma réponse est lapidaire:
– la meilleure piste que j’ai trouvée et qu’il faudrait explorer avec spatialite est ici => http://orbisgis.3871844.n2.nabble.com/Calcul-d-orientation-d-un-batiment-td5631480.html (antépénultième message)
pour ArcGis j’ai bien cela => http://help.arcgis.com/fr/arcgisdesktop/10.0/help/index.html#//007000000028000000
même si au premier coup d’œil je ne comprend pas bien la mise en œuvre…
saadia tiens nous au courant du résultat.
Sinon voir avec Whitebox (que je ne connaissait pas) et l’outil « Minimum Bounding Box » qui peut te sortir un shape avec le rectangle minimum englobant (a ne pas confondre avec bbox et autres convexhull) avec en attribut soit la longueur du plus grand coté (pratique pour la longueur des tranchées) ou l’orientation (mais en grade me semble t’il)….. la classe non ? un hic cependant avec la perte des attributs du shape de départ.
PS: trouvé à partir de ce post sur GIS.stackexchange => http://gis.stackexchange.com/questions/22895/how-to-find-the-minimum-area-rectangle-for-given-points
PS2: cherche pythoneur pour implémentation dans qgis…. dans traitement voire plug-in…..
[modi 5/12/14] la solution est là => [Whitebox GAT 3.2 – QGIS 2.x] Automatiser le calcul de longueur et d’orientation d’un polygone. http://ift.tt/eA8V8J c’est ici => http://ift.tt/1A0kn02
Bonjour,
Un petit déterrage de vieux fil…
J’ai découvert par hasard cet outil magique pour QGIS :
http://georezo.net/forum/viewtopic.php?pid=281922
Qui peut donner tout seul l’orientation et les dimensions d’un polygone… Exactement ce qu’il faut pour du funéraire !
Bonjour,
Bien le tuto, et même on révise les maths en même temps, c’est le bonheur !
Seul « hic » à mon niveau, un message d’erreur qui me dit : « une erreur s’est produite lors de l’évaluation de la chaîne de calcul : l’index est hors de portée ». En-dessous, ds ma table attributaire, je vois le nv champ créé avec les valeurs qui apparaissent, mais dès que je clique OK au message d’erreur, le nv champ s’efface… c’est vexant !
une idée de ce qu’il peut se passer?
Euh il faudrait reussir a reproduire lerreur.. Es tu certaine du type de ton champs (entier ou decimal) et de la longueur suffisante ? Question subsidiaire : quelle version de QGIS ?
Bonjour.
J’ai eu le même problème que vous, je viens tout juste de le résoudre.
Je vous conseille de créer un champ virtuel dans lequel vous calculerez l’azimuth (et oui QGis veut bien le calculer, mais que dans un champ virtuel…). Vous regardez ensuite dans votre champ quels sont les objets avec les valeurs « null ». Ce sont eux qui posent problème. On peut essayer de résoudre le problème mais personnellement ça ne concernait que 3 de mes objets sur 3000 donc j’ai supprimé et recréé. Et ensuite vous n’avez plus qu’à créer un champ « en dur » et y calculer l’azimuth.
Bonjour,
Merci pour ce tuto! Je débute sous QGIS et j’aurais une question (relativement simple j’imagine mais je ne m’en sors pas bien), alors j’en profite pour utiliser ce forum!
J’ai sous QGIS une couche de polyligne. J’aimerais récupérer les coordonnées de début et fin de mes lignes, et ai bien essayé avec xat et yat. Seulement le résultat rendu est un nombre entier, et j’aimerais pouvoir avoir le résultat en degré minute. Est-ce possible avec QGIS? (mes couches sont en Lambert 93, j’ai essayé avec WGS 84 mais le résultat reste le même).
ce n’est peut-êtrer pas le bon endroit pour poser ce type de question, mais merci par avance!
[…] A noter quand même que les orientations sont indiquées sous la forme d’un angle de 0 à 180 degrés par rapport au Nord, en même temps vu que vous avez une Polyligne vous n’avez qu’à vous referez au tutoriel dédié à l’orientation d’une Polyligne sur ce même blog => https://archeomatic.wordpress.com/2012/10/20/qgis-1-8-calculer-lorientation-dune-polyligne/ […]
ceci dis , on peut exporter en shape le calque des axes de coupe (changer l’unité de grade en degré) l’orientation des « lignes » …
(suite du commentaire précédent) : j’ai trouvé une feinte avec la toolbox d’arcgis raster-surface-exposition… c’est une solution précaire mais qui donne un résultat correct. Il suffit de rasteriser les polylignes.
le résultat en image. Il reste que les contours du parcellaire fonctionne plutôt bien. Mais l’entité polygone parcelle a elle été transformée en polylignes. Il faut donc passer derrière pour supprimer ces éléments parasites : https://drive.google.com/file/d/0BzVLokYWXUOCMXpBa0JYMFFQVnM/view?usp=sharing
dans le cas ou l’azimut est précisément égal à 90, il y une division par zéro et la formule retourne NULL
Bonjour Jérôme,
ce post date un peu ;( j’utilise maintenant cette formule dans la calculatrice de champs:
degrees( azimuth( start_point($geometry), end_point($geometry) ) )
Détail de la fonction:
fonction Math → degrees(): convertit des angles en radians vers des degrés.
fonction Géométrie → azimuth(point a, point b): renvoie l’azimut par rapport au nord sous forme d’angle en radians mesuré dans le sens des aiguilles d’une montre à partir de la verticale entre point_a et point_b.
fonctions Géométries → start_point et end_point : renvoient respectivement le premier et le dernier nœud d’une géométrie.
fonction Géométrie → $geometry: renvoie la géométrie de l’entité courante. Cette fonction peut être utilisée en combinaison avec d’autres fonctions.
Si cela règle ton problème dis le moi.. je le mettrais en haut du post.
Merci pour ce tutoriel clair et concis !!