#1 Wed 01 February 2017 14:18
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
[PostGIs] : calcul d'angles de polygones
Bonjour,
J'ai des polygones pour lesquels je souhaite calculer chaque angle. J'applique cette requête
Code:
SELECT id_quadri,id_triangle1, ST_AsText( ST_MakeLine(sp,ep) ), az FROM -- extract the endpoints for every 2-point line segment for each linestring (SELECT id_quadri,id_triangle1, ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp, ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep, ST_Azimuth(ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)), ST_PointN(geom, generate_series(2, ST_NPoints(geom) ))) as az FROM -- extract the individual linestrings (SELECT id_quadri,id_triangle1, (ST_Dump(ST_Boundary(geom))).geom FROM "000step1_quadri" ) AS linestrings ) AS segments;
mais j'ai un message
functions and operators can take at most one set argument
.
Je ne comprends pas ! Quelqu'un pourrait-il m'aider?
D'avance merci
Hors ligne
#2 Wed 01 February 2017 16:48
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [PostGIs] : calcul d'angles de polygones
Salut
Ce que le message dit, c'est qu'une fonction ou un opérateur ne peut pas avoir
plus d'un argument qui est un ensemble (set).
Un exemple de fonction dans votre requête qui a un argument de type ensemble,
mis en gras:
st_pointn(geom, generate_series(1, st_npoints(geom) -1))
cf https://www.postgresql.org/docs/9.6/sta … s-srf.html
Hors, les deux arguments de votre appel à st_azimuth sont des ensembles par transitivité
puisque ce sont les résultats de fonction utlisant elles mêmes des fonctions qui retournent
des ensembles : generate_series().
La solution serait de déplacer st_azimuth dans votre clause SELECT principale.
Dernière modification par tumasgiu (Wed 01 February 2017 17:13)
Hors ligne
#3 Wed 01 February 2017 18:56
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [PostGIs] : calcul d'angles de polygones
Merci pour la réponse, je vais tester.
Je vous ferai un retour demain
Hors ligne
#4 Thu 02 February 2017 10:43
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [PostGIs] : calcul d'angles de polygones
Bonjour, j'ai fait ce que tu me conseillais :
Code:
SELECT id_quadri,id_triangle1, ST_AsText( ST_MakeLine(sp,ep) ), degrees(st_azimuth(sp, ep)) FROM -- extract the endpoints for every 2-point line segment for each linestring (SELECT id_quadri,id_triangle1, ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp, ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep FROM -- extract the individual linestrings (SELECT id_quadri,id_triangle1, (ST_Dump(ST_Boundary(geom))).geom FROM "000step1_quadri" ) AS linestrings ) AS segments;
mais le résultat ne me semble pas correct (il me donne l'angle extérieur par rapport au nord).
Il me faut donc refaire des calculs, alors?
Ce que je voudrais obtenir, c'est la valeur de chaque angle intérieur directement.
D'avance merci
Hors ligne
#5 Thu 02 February 2017 11:22
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [PostGIs] : calcul d'angles de polygones
Oui il va falloir calculer vous même,
il n'y a pas à ma connaissance de fonction toute prête
pour calculer ce qu vous voulez.
Hors ligne
#6 Mon 06 February 2017 08:20
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [PostGIs] : calcul d'angles de polygones
Bonjour,
Il faut souligner que la fonction st_azimuth est une fonction qui renvoie un gisement (ou azimut) ie gisement 0 pour le Nord et orientation dans le sens inverse de la trigonométrie. Ce qui change pas mal de choses ... les sinus deviennent des cosinus etc ...
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#7 Mon 06 February 2017 10:21
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [PostGIs] : calcul d'angles de polygones
Bonjour,
Pour la fonction st_azimuth, je pense avoir compris son fonctionnement.
Par contre, maintenant que j'ai réussi mon calcul d'angle, je me retrouve avec des lignes en plus, pour chaque polygone, j'arrive à avoir tous les angles (mais en ligne et non en colonne). J'ai testé avec mes lignes et la première ligne semble me renvoyer la bonne valeur de chaque angle de mes polygones (la somme est égale à 360°).
Je ne vois pas trop comment corriger ce problème!
Ted
Hors ligne
#8 Mon 06 February 2017 10:23
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: [PostGIs] : calcul d'angles de polygones
Bonjour,
n'y a-t-il pas possibilité d'écrire une requête à partir du Théorème d'Al-Kashi (théorème de Pythagore généralisé), car il me semble possible de connaitre les longueurs de chacune des arrêtes ?
http://www.math93.com/index.php/histoir … d-al-kashi
Il doit en effet y avoir quelques sous-requêtes mais c'est dans cette direction que je serais allée.
Bon courage,
Dernière modification par ppluvinet (Mon 06 February 2017 10:53)
Pascal PLUVINET
Hors ligne
#9 Mon 06 February 2017 11:51
Re: [PostGIs] : calcul d'angles de polygones
hello,
une ressource intéressante : http://gis.stackexchange.com/questions/ … dge-length
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#10 Wed 08 February 2017 08:08
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [PostGIs] : calcul d'angles de polygones
Bonjour,
En me replongeant dans la trigo, puis en faisant des tests avec le papier et le crayon. J'ai réussi à récupérer ce que je voulais.
C'est certainement pas super propre pour un pro du sql, mais pour moi, ça me convient (le tout en passant par des requêtes intermédiaires).
A+
Hors ligne
#11 Wed 08 February 2017 08:46
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: [PostGIs] : calcul d'angles de polygones
Bonjour,
Même si ce n'est pas très propre, ce serait intéressant de nous faire partager !
Quitte à ce que des "pro du sql" optimise et nettoie un peu le code en question.
Pascal PLUVINET
Hors ligne
#12 Wed 08 February 2017 09:22
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [PostGIs] : calcul d'angles de polygones
Ok,
Je me lance ;-)
Code:
--angle create table "test_angle" as SELECT id_quadri,id_triangle1, ST_AsText( ST_MakeLine(sp,ep) ), degrees(st_azimuth(sp, ep)) as pt1 ,degrees(st_azimuth(sp2, ep2)) as pt2,degrees(st_azimuth(sp3, ep3)) as pt3,degrees(st_azimuth(sp4, ep4)) as pt4, @(180-(@(degrees(st_azimuth(sp2, ep2))-degrees(st_azimuth(sp, ep)))) )as angl1, @(180-(@(degrees(st_azimuth(sp3, ep3))-degrees(st_azimuth(sp2, ep2)))) ) as angl2, @(180-(@(degrees(st_azimuth(sp4, ep4))-degrees(st_azimuth(sp3, ep3)))) ) as angl3, @(180-(@(degrees(st_azimuth(sp, ep))-degrees(st_azimuth(sp4, ep4)))) ) as angl4 FROM -- extract the endpoints for every 2-point line segment for each linestring (SELECT id_quadri,id_triangle1, ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp, ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep, ST_PointN(geom, generate_series(2, ST_NPoints(geom)-1)) as sp2, ST_PointN(geom, generate_series(3, ST_NPoints(geom) )) as ep2, ST_PointN(geom, generate_series(3, ST_NPoints(geom)-1)) as sp3, ST_PointN(geom, generate_series(4, ST_NPoints(geom) )) as ep3, ST_PointN(geom, generate_series(4, ST_NPoints(geom)-1)) as sp4, ST_PointN(geom, generate_series(5, ST_NPoints(geom) )) as ep4 FROM -- extract the individual linestrings (SELECT id_quadri,id_triangle1, (ST_Dump(ST_Boundary(geom))).geom FROM "000step1_quadri" ) AS linestrings _; ) AS segments;
création d'une table réunissant tous mes polygones, puis sur cette table recherche des "lignes" et calcul de la somme des angles des polygones
Code:
create table "test_angle_ligne360" as select *, case when angl1 = 180 then 'ligne' when angl2 = 180 then 'ligne' when angl3 = 180 then 'ligne' when angl4 = 180 then 'ligne' end "recherche_ano", (angl1 +angl2 +angl3 +angl4) as sommeangle from "test_angle" ; alter table "test_angle_ligne360" alter column sommeangle type decimal;
ENfin conservation uniquement des objets dont la somme est égale à 360°.
Code:
create or replace view "test_angle_ligne360_vrai" as select * from "test_angle_ligne360" where recherche_ano is null and sommeangle = 360
Voilà.
Pas taper moi :-|
Hors ligne