#1 Thu 14 January 2010 15:52
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Creation Ligne A Partir De Points
Bonjour au forum et bonne année 2010.
Je suis en train d'essayer de créer des lignes à partir de points gps.
Les points gps récoltés font partie d'une ligne.
donc j'ai une table POINTS avec une colonne id_ligne pour savoir à quelle ligne appartient le point.
J'arrive à sélectionner les points dont l'identifiant est connu pour construire ma ligne mais je suis obligé de le faire un par un avec le code suivant.
Code:
SELECT st_makeline(the_geom) as ligne, t.id_ligne FROM (SELECT the_geom, id_ligne FROM points where id_ligne = 'L12') l group by t.id_ligne;
ainsi j'ai créé la ligne 12.
cependant, j'ai des dizaines et des dizaines de lignes et je voudrais que postGIS me crée toutes les lignes si l'identifiant est identique.
J'ai essayé quelque chose comme ça, mais ça ne va pas :
Code:
SELECT st_makeline(the_geom) as ligne, t.id_ligne FROM (SELECT the_geom, id_ligne FROM points where id_ligne = id_ligne) l group by t.id_ligne;
il me met l'erreur suivante : ERREUR: geometry requires more points
Je me dis qu'en faisant une union ça pourrait fonctionner mais pour l'instant, je n'y arrive pas.
est-ce que vous auriez une idée pour réaliser cette requête ?
je vous remercie d'avance,
à bientôt,
cordialement,
Hors ligne
#2 Thu 14 January 2010 17:46
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Creation Ligne A Partir De Points
Bonjour au forum et bonne année 2010.
Je suis en train d'essayer de créer des lignes à partir de points gps.
Les points gps récoltés font partie d'une ligne.
donc j'ai une table POINTS avec une colonne id_ligne pour savoir à quelle ligne appartient le point.
J'arrive à sélectionner les points dont l'identifiant est connu pour construire ma ligne mais je suis obligé de le faire un par un avec le code suivant.Code:
SELECT st_makeline(the_geom) as ligne, t.id_ligne FROM (SELECT the_geom, id_ligne FROM points where id_ligne = 'L12') l group by t.id_ligne;ainsi j'ai créé la ligne 12.
cependant, j'ai des dizaines et des dizaines de lignes et je voudrais que postGIS me crée toutes les lignes si l'identifiant est identique.
J'ai essayé quelque chose comme ça, mais ça ne va pas :Code:
SELECT st_makeline(the_geom) as ligne, t.id_ligne FROM (SELECT the_geom, id_ligne FROM points where id_ligne = id_ligne) l group by t.id_ligne;il me met l'erreur suivante : ERREUR: geometry requires more points
Je me dis qu'en faisant une union ça pourrait fonctionner mais pour l'instant, je n'y arrive pas.
est-ce que vous auriez une idée pour réaliser cette requête ?
je vous remercie d'avance,
à bientôt,
cordialement,
Bonjour,
Et sans preciser l'identifiant des lignes ?
Il va creer toutes les lignes pour chaque identifiant de ligne, avec la clause group by, non ?
Nicolas
Hors ligne
#3 Fri 15 January 2010 11:14
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Re: Creation Ligne A Partir De Points
Bonjour Monsieur Ribot,
Merci de votre réponse.
j'ai essayé ceci :
Code:
SELECT st_makeline(the_geom) as ligne FROM (SELECT the_geom, id_ligne FROM point)t group by t.id_id_ligne;
et il me met la même erreur : ERREUR: geometry requires more points
j'ai essayer de faire geomunion mais je me rends compte que la fonciton geomunion (geometry) n'existe plus !
Hors ligne
#4 Fri 15 January 2010 11:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Creation Ligne A Partir De Points
Bonjour Monsieur Ribot,
Merci de votre réponse.
j'ai essayé ceci :Code:
SELECT st_makeline(the_geom) as ligne FROM (SELECT the_geom, id_ligne FROM point)t group by t.id_id_ligne;et il me met la même erreur : ERREUR: geometry requires more points
j'ai essayer de faire geomunion mais je me rends compte que la fonciton geomunion (geometry) n'existe plus !
Sur quelle version de postgis/pg travaillez-vous ?
Sur la 1.4, st_union(geometry) est definie.
Sinon, pour le message d'erreur, ce peut-il que certains identifiants de lignes fassent reference a seulement un seul point ? auquel cas makeline renvoie cette erreur.
Si c'est le cas, il faut rajouter une clause where pour filtrer les id_id_ligne qui referencent plus d'un point.
Nico
Hors ligne
#5 Fri 15 January 2010 12:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Creation Ligne A Partir De Points
Bonjour Monsieur Ribot,
Merci de votre réponse.
j'ai essayé ceci :Code:
SELECT st_makeline(the_geom) as ligne FROM (SELECT the_geom, id_ligne FROM point)t group by t.id_id_ligne;et il me met la même erreur : ERREUR: geometry requires more points
j'ai essayer de faire geomunion mais je me rends compte que la fonciton geomunion (geometry) n'existe plus !
Sur une pgis 1.4, j'ai testé une table contenant :
idligne; geom
1;"POINT(0 0)"
1;"POINT(1 1)"
2;"POINT(2 2)"
2;"POINT(2 3)"
3;"POINT(5 3)"
et la requete suivante:
SELECT st_astext(st_makeline(the_geom)) as ligne
FROM (SELECT geom AS THE_GEOM, idligne
FROM test) t
group by t.idligne;
qui me renvoie:
"LINESTRING(2 2,2 3)"
"LINESTRING(5 3)"
"LINESTRING(0 0,1 1)"
j'ai aussi essayé avec un identifiant ne concernant aucun point, et une ligne vide est créée par la requete.
Nicolas
Hors ligne
#6 Fri 15 January 2010 14:55
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Re: Creation Ligne A Partir De Points
re bonjour,
J'ai une version pgis 1.4 avec un postgres 8.4.2
La requête précédente ne fonctionne pas (toujours la même erreur) mais j'ai finalement, réussit avec st_union.
voici mon code :
Code:
SELECT points.id_ligne, st_union(points.the_geom) AS the_geom FROM points WHERE isvalid(points.the_geom) GROUP BY points.id_ligne ORDER BY points.id_ligne;
cependant, je ne peux pas prendre les colonnes que je veux car il y a le group by qui m'oblige à écrire le nom de chaque colonne sélectionnée dans la clause GROUP BY sinon je me retrouve avec plus d'enregistrement que prévus.
Je créé donc ma vue avec seulement deux colonne et toutes les infos intéressantes derrières n'apparaissent pas.
Cependant, je pense que si je fait une copie de ces données dans une nouvelle table "ligne" je n'aurais pas de problème.
en tout cas, merci beaucoup pour votre aide, je n'arrivais pas a trouver l'équivalent de geomunion(geometry), et dans ma version il y a geomunion(geometry, geometry) mais ça ne fonctionnait pas. je ne savais pas qu'ils l'avaient remplacé par st_union.
merci encore et à bientôt,
cordialement,
Hors ligne
#7 Fri 15 January 2010 15:42
Re: Creation Ligne A Partir De Points
Bonjour,
Cela me parait logique. Si tu regroupes deux lignes dont les valeurs des attributs sont différents, comment veux tu que le serveur regroupe ces valeurs si vous ne le lui dite pas ?
Admettons que tu as deux lignes avec un champ attributaire qui donne une durée moyenne en s (par exemple 500 et 1000). Dans ton SELECT tu rajoutes average(duree) et tu obtiendras "750" dans le champ duree de ta ligne fusionnée.
Si tu as des champs attributaires texte identique, tu fais un length() ou max() ou autre fonction qui gère le bon type de champ, si les deux valeurs sont les mêmes il retournera toujours la même
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#8 Fri 15 January 2010 15:59
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Creation Ligne A Partir De Points
re bonjour,
J'ai une version pgis 1.4 avec un postgres 8.4.2
La requête précédente ne fonctionne pas (toujours la même erreur) mais j'ai finalement, réussit avec st_union.
voici mon code :Code:
SELECT points.id_ligne, st_union(points.the_geom) AS the_geom FROM points WHERE isvalid(points.the_geom) GROUP BY points.id_ligne ORDER BY points.id_ligne;cependant, je ne peux pas prendre les colonnes que je veux car il y a le group by qui m'oblige à écrire le nom de chaque colonne sélectionnée dans la clause GROUP BY sinon je me retrouve avec plus d'enregistrement que prévus.
Je créé donc ma vue avec seulement deux colonne et toutes les infos intéressantes derrières n'apparaissent pas.
Cependant, je pense que si je fait une copie de ces données dans une nouvelle table "ligne" je n'aurais pas de problème.
en tout cas, merci beaucoup pour votre aide, je n'arrivais pas a trouver l'équivalent de geomunion(geometry), et dans ma version il y a geomunion(geometry, geometry) mais ça ne fonctionnait pas. je ne savais pas qu'ils l'avaient remplacé par st_union.
merci encore et à bientôt,
cordialement,
La version 8.4 permet desormais de faire des windows queries (http://www.postgresql.org/docs/8.4/stat … indow.html).
C'est tres puissant et permet typiquement de raffiner un peu ses requetes contenant des clauses group by, en pouvant desormais grouper des lignes autour du curseur courant (si j'ai bien tout compris )
A tester en tout cas.
Nicolas
Hors ligne
#9 Fri 15 January 2010 16:04
Re: Creation Ligne A Partir De Points
Et en version française :
http://docs.postgresql.fr/8.4/tutorial-window.html
Cela me semble convenir parfaitement. Si on reprend l'exemple de la doc, le nomdep est id_ligne, le salary est le champ the_geom enfin la fonction d'aggrégation est l'union.
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne