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

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

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

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

Re: [POSTGIS] : création de plusieurs polygones à partir de coordonnées.

Cool wink

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

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

 

Pied de page des forums

Powered by FluxBB