Pages: 1
- Sujet précédent - [POSTGIS] : création de plusieurs polygones à partir de coordonnées. - Sujet suivant
#1 Thu 14 April 2016 17:53
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
[POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Bonjour,
J'ai réalisé une requête dans laquelle j'arrive à récupérer des coordonnées qui vont m'être utile pour construire de nouveaux polygones.
Mais c'est à partir de maintenant que je sèche, pour chaque ligne (id) j'ai 4 jeux de coordonnées (voir pièce jointe la copie d'écran pour être plus clair), et je souhaite donc créer 3 polygones de cette façon :
X1Y1/X2Y2/Xc1Yc1/X1Y1
X1Y1/Xc1Yc1/X3Y3/X1Y1
X2Y2/Xc1Yc1/X3Y3/X2Y2
mais comment faire (ou quelle est la meilleure façon de procéder), je débute! Je me doute qu'il doit y avoir besoin de boucles...
Cordialement
Hors ligne
#2 Thu 14 April 2016 18:42
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Bonsoir,
Souvent, le SQL peut remplacer les boucles.
Ici, vous avez la liste des coord composant chaque polygone. Vous pouvez les stocker dans un Array, puis fabriquer une ligne avec cet array de points, enfin, fabriquer un polygon avec cette ligne: si la ligne est fermée (coord finales=coord initiales), un polygone est construit:
(la forme VALUES(...) permet de fabriquer des lignes a partir de valeurs. Les colonnes s'appellent alors column1, column2, etc.
Array[col1, col2, col3...] permet de regrouper les colonnes dans un tableau.)
Code:
with tmp as ( values (0, 0, 0, 2, 0, 1, 1, 0, 0), (1, 3, 3, 5, 3, 4, 4, 3, 3) ) select column1 as id, st_astext(st_makePolygon(st_makeLine( array[st_makePoint(column2, column3), st_makePoint(column4, column5), st_makePoint(column6, column7), st_makePoint(column8, column9)]))) as geom from tmp; id geom ---+----------- 0 POLYGON((0 0,2 0,1 1,0 0)) 1 POLYGON((3 3,5 3,4 4,3 3))
Nico
Hors ligne
#3 Fri 15 April 2016 10:21
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Bonjour Nicolas,
J'ai reproduit ton exemple et ça fonctionne.
Mais quand on a 5599 lignes à traiter, je pense qu'il faut modifier quelque-chose? Le values doit appeler des entêtes de colonnes?
D'avance merci
Hors ligne
#4 Fri 15 April 2016 12:55
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Bonjour,
Hmm oui: le values, c'etait juste pour générer des points a partir de rien,
Dans votre cas, il faut faire dans la partie WITH tmp ... le select qui produit les colonnes x/y des points des polygones:
Code:
with tmp as ( select x1, y1, x2, y2, x3, y3... from matable where ... ) select column1 as id, st_astext(st_makePolygon(st_makeLine( array[st_makePoint(x1, y1), st_makePoint(x2, y2), st_makePoint(x3, y3), st_makePoint(x4, y4)]))) as geom from tmp;
Nicolas
Hors ligne
#5 Fri 15 April 2016 14:18
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
NIcolas,
C'est sur quoi je tendais ;-), mais il y a toujours un mais avec un débutant, soit il faut que je refasse deux autres fois cette instruction en changeant l'ordre des points dans "array" soit il y a une solution pour boucler sur les deux autres cas.
Mon but est de créer à partir de mes coordonnées, 3 triangles pour lesquels j'impose les coordonnées. Ci-dessous les 3 cas, qui avec l'instruction fourni me font 3 colonnes (je pense que je pourrai faire 3 fois cette méthode avec un INSERT INTO dans ma table de réception, mais il y a peut-être plus simple?)
st_astext(st_makePolygon(st_makeLine(
array[st_makePoint(x1, y1),
st_makePoint(x2, y2),
st_makePoint(xc1, yc1),
st_makePoint(x1, y1)]
))) as geom,
st_astext(st_makePolygon(st_makeLine(
array[st_makePoint(x1, y1),
st_makePoint(xc1, yc1),
st_makePoint(x3, y3),
st_makePoint(x1, y1)]))) as geom
st_astext(st_makePolygon(st_makeLine(
array[st_makePoint(x2, y2),
st_makePoint(xc1, yc1),
st_makePoint(x3, y3),
st_makePoint(x2, y2)]))) as geom
Merci d'avance
Hors ligne
#6 Fri 15 April 2016 14:50
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Ne pas hésiter a copier la requete complete dans le message. Avec juste un bout, difficile de se rendre compte de votre cas d'usage.
Si j'ai bien compris, vous disposez de toutes les coordonnées permettant de faire les 3 triangles pour chaque ligne de votre requete.
Ca doit bien produire 3 polygones par id différent ?
Si c'est le cas, une solution en une seule requete consiste a fabriquer les 3 polygones dans la meme ligne de requete, à les agréger dans un tableau, puis à dumper ce tableau (UNNEST) en lignes: on obtient alors 3 polygones par id de départ, pour les 3 triangles.
En reprenant mon exemple mais en construisant les points avec des SELECT, histoire de nommer les colonnes comme vous, ca donnerait:
Code:
WITH tmp AS ( select 0 as id, 0 as x1, 0 as y1, 2 as x2, 0 as y2, 1 as xc1, 1 as yc1, 0 as x3, 0 as y3 UNION select 1 as id, 3 as x1, 3 as y1, 5 as x2, 3 as y2, 4 as xc1, 4 as yc1, 3 as x3, 3 as y3 ), tmp1 as ( SELECT id, ARRAY [ st_makePolygon(st_makeLine( ARRAY [st_makePoint(x1, y1), st_makePoint(x2, x2), st_makePoint(xc1, yc1), st_makePoint(x1, y1)])), st_makePolygon(st_makeLine( ARRAY [st_makePoint(x1, y1), st_makePoint(xc1, yc1), st_makePoint(x3, y3), st_makePoint(x1, y1)])), st_makePolygon(st_makeLine( ARRAY [st_makePoint(x2, y2), st_makePoint(xc1, yc1), st_makePoint(x3, y3), st_makePoint(x2, y2)])) ] as triangles FROM tmp ) select id, st_astext(unnest(triangles)) as triangle from tmp1; id triangle ---+--------------------------------- 0 POLYGON((0 0,2 2,1 1,0 0)) 0 POLYGON((0 0,1 1,0 0,0 0)) 0 POLYGON((2 0,1 1,0 0,2 0)) 1 POLYGON((3 3,5 5,4 4,3 3)) 1 POLYGON((3 3,4 4,3 3,3 3)) 1 POLYGON((5 3,4 4,3 3,5 3))
Nicolas
Hors ligne
#7 Fri 15 April 2016 15:19
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Merci Nicolas
Ca fonctionne parfaitement.
Bon week-end
Hors ligne
#8 Fri 15 April 2016 15:22
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Cool
Bon we à vous
Hors ligne
#9 Mon 18 April 2016 08:13
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Nicolas,
Juste une question en passant, le résultat que l'on obtient ne devrait-il pas créer une table "géométrique"? Le résultat donne un champ texte!
D'avance merci.
Hors ligne
#10 Mon 18 April 2016 08:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Bonjour,
Là, dans ces exemples, il y a l'appel à st_asText() pour afficher les objets en texte !! (plus facile pour visualiser ce qui se passe)
(je vous invite à lire la doc PostGIS, assez courte et très complète: http://postgis.net/docs/)
Nicolas
Hors ligne
#11 Mon 18 April 2016 09:14
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.
Merci,
saine lecture en effet.
Hors ligne
Pages: 1
- Sujet précédent - [POSTGIS] : création de plusieurs polygones à partir de coordonnées. - Sujet suivant