Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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: 1132

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: 1132

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: 3169
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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1017
Site web

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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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

 

Pied de page des forums

Powered by FluxBB