#1 Thu 20 January 2011 14:44
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
postgis: fusion de polylignes (jointure)
Bonjour,
cela fait plusieurs fois que je bute sur ce petit problème avec plusieurs outils... Je fini en général par retracer la polyligne à la main mais c'est contraignant.
J'ai deux polylignes disjoints et j'aimerais pouvoir les fusionner pour en faire une seule (avec un seul enregistrement lié).
Pour cela il faudrait
1) utiliser un outil qui permette à la première ligne de s'accrocher à la deuxième (un catch feature)
2) fusionner/dissoudre les deux entités (dissolve) pour me donner une seule entité
J'ai essayé lignemerge() mais ce n'est pas ça.
J'ai trouvé en ligne ce genre de fonction
"SELECT ST_Union(the_geom) INTO dissolved_polygons FROM your_table GROUP BY your_attribute;" mais c'est pour des polygones qui partagent déjà une frontière commune.
Si quelqu'un peut m'aider à résoudre une fois pour toute ce problème...
merci!
Anaïs
Hors ligne
#2 Thu 20 January 2011 15:19
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonjour,
cela fait plusieurs fois que je bute sur ce petit problème avec plusieurs outils... Je fini en général par retracer la polyligne à la main mais c'est contraignant.
J'ai deux polylignes disjoints et j'aimerais pouvoir les fusionner pour en faire une seule (avec un seul enregistrement lié).
Pour cela il faudrait
1) utiliser un outil qui permette à la première ligne de s'accrocher à la deuxième (un catch feature)
2) fusionner/dissoudre les deux entités (dissolve) pour me donner une seule entité
J'ai essayé lignemerge() mais ce n'est pas ça.
J'ai trouvé en ligne ce genre de fonction
"SELECT ST_Union(the_geom) INTO dissolved_polygons FROM your_table GROUP BY your_attribute;" mais c'est pour des polygones qui partagent déjà une frontière commune.
Si quelqu'un peut m'aider à résoudre une fois pour toute ce problème...
merci!
Anaïs
Bonjour,
Si les lignes se touchent, vous pouvez utiliser un groupement spatial:
group by st_touches(ligne1, ligne2)
si elles ne se touchent pas, le groupement se ferait plutot avec l'operateur distance, si tant est que les lignes a joindre entre elles sont a une distance minimale entre elles. Par exemple, si deux lignes sont plus proches de X metres, alors il faut les joindre; la condition serait:
group by st_distance(ligne1.startpoint, ligne2.startpoint) < X or st_distance(ligne1.endpoint, ligne2.startpoint) < X ...
etc... pour les combinaisons startpoint/endpoint des deux lignes.
(Pas sur d'etre tres clair )
Je tente de trouver un vrai exemple...
Nicolas
Hors ligne
#3 Thu 20 January 2011 16:02
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: postgis: fusion de polylignes (jointure)
Merci, du coup j'ai essayé ta fonction
Code:
select e1.gid, e1.the_geom from essai2 e1, essai2 e2 group by e1.gid, e1.the_geom, st_distance(pointN(e1.the_geom,1), pointN(e2.the_geom,1)) < 200 or st_distance(pointN(e1.the_geom,(Numpoints(e1.the_geom))), pointN(e2.the_geom,Numpoints(e2.the_geom))) < 200;
mais mes trois lignes sont toujours séparées....
Je ne comprends pas.
Hors ligne
#4 Thu 20 January 2011 16:44
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: postgis: fusion de polylignes (jointure)
Ou alors grouper sur le critère d'identité entre coordonnées des extrémités. ST_UNION étant l'équivalent Postgis de SDO_AGGR_CONCAT_LINES chez Oracle, je pense moi aussi que c'est la bonne solution.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#5 Thu 20 January 2011 16:48
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: postgis: fusion de polylignes (jointure)
Pardon, ce doit être la fatigue, je n'ai pas compris "sur le critère d'identité entre coordonnées des extrémités".
Hors ligne
#6 Thu 20 January 2011 17:17
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Merci, du coup j'ai essayé ta fonction
Code:
select e1.gid, e1.the_geom from essai2 e1, essai2 e2 group by e1.gid, e1.the_geom, st_distance(pointN(e1.the_geom,1), pointN(e2.the_geom,1)) < 200 or st_distance(pointN(e1.the_geom,(Numpoints(e1.the_geom))), pointN(e2.the_geom,Numpoints(e2.the_geom))) < 200;mais mes trois lignes sont toujours séparées....
Je ne comprends pas.
Pardon, j'ai ete un peu court dans mes explications:
plutot une requete du style:
Code:
select case when st_dwithin(st_endpoint(t1.geometry), st_startpoint(t2.geometry), 10) then st_linemerge( st_collect( st_addpoint( t1.geometry, st_startpoint(t2.geometry)), t2.geometry)) when st_dwithin(st_startpoint(t1.geometry), st_endpoint(t2.geometry), 10) then st_linemerge( st_collect( st_addpoint( t2.geometry, st_startpoint(t1.geometry)), t2.geometry)) END from toto t1, toto t2 where t1.id <> t2.id and (st_dwithin(st_startpoint(t1.geometry), st_startpoint(t2.geometry), 10) or st_dwithin(st_startpoint(t1.geometry), st_endpoint(t2.geometry), 10) or st_dwithin(st_endpoint(t1.geometry), st_startpoint(t2.geometry), 10) or st_dwithin(st_endpoint(t1.geometry), st_endpoint(t2.geometry), 10));
Ici donc, je considere que les lignes a joindre ne se touchent pas.
Le group by permet de garder les lignes correspondant au critere de proximité.
La partie select regarde les conditions pour ajouter un point a une des deux lignes,histoire de les rendre jointives.
Le linemerge fabrique ensuite une seule ligne a partir des deux lignes rendues jointives.
A affiner pour:
• Supporter les multi
• merger le resultat final pour ne pas avoir des lignes qui se superposent.
Je joins une image: en haut, e reseau initial, en bas: le resultat de la requete.
Nico
PS. (merci, ca va me faire un bon sujet de TP pour la prochaine formation Postgis )
Hors ligne
#7 Thu 20 January 2011 17:20
- Anaïs Just
- Participant actif
- Lieu: Montreuil
- Date d'inscription: 10 Dec 2007
- Messages: 131
Re: postgis: fusion de polylignes (jointure)
Je teste ça demain!
Merci c'est exactement ce que je cherchait à réaliser!
C'est quand même dommage qu'il n'y ait pas une fonction toute prête. A développer...
Du travail pour les élèves :-) chouette! espérons qu'ils n'auront pas l'idée d'aller sur le georezo trouver la réponse :-)
Dernière modification par Anaïs Just (Thu 20 January 2011 17:22)
Hors ligne
#8 Thu 20 January 2011 17:35
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Je teste ça demain!
Merci c'est exactement ce que je cherchait à réaliser!
C'est quand même dommage qu'il n'y ait pas une fonction toute prête. A développer...
Du travail pour les élèves :-) chouette! espérons qu'ils n'auront pas l'idée d'aller sur le georezo trouver la réponse :-)
Hihi, oui effectivement. Je viens de me cramer, là
A propos de ces fonctions non existantes dans postgis: les dev postgis se concentrent surtout sur les fonctions "de base", style, Union, linemerge etc. bien définies dans un cadre précis.
Dès qu'il s'agit de faire des traitements plus SIG, avec prise en compte de bcp de conditions, c'est plus difficile de faire des fonctions génériques.
Mais je suis d'accord avec toi qu'un entrepot central ou ces procedures pourraient etre telechargées, ca serait bien. C'est l'esprit du Wiki Postgis.
(là, par ex, j'ai un peu triché dans la mesure ou j'ai retourné (st_reverse) les lignes qui n'etaient pas dans le bon sens et me donnaient des résultats faux. Ce retournement pourrait se faire dans la requete je pense).
Nicolas
Hors ligne
#9 Fri 21 January 2011 10:12
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonjour,
Parmi les libertés que je me suis permis de prendre avec la réalité, dans mon exemple d'hier, il y notamment le fait que les lignes a joindre sont facilement identifiables: il n'y a qu'une ligne voisine d'une autre ligne.
Dans le cas ou plusieurs lignes seraient voisines d'une ligne donnée, il faut trouver un moyen de determiner laquelle joindre.
Nicolas
Hors ligne
#10 Tue 31 January 2012 20:53
- macdoc
- Participant occasionnel
- Date d'inscription: 31 Jan 2012
- Messages: 11
Re: postgis: fusion de polylignes (jointure)
Bonsoir,
j'ai un problème similaire au sujet évoqué ci dessus. A savoir:
-une table qui comprend un ensemble de linestring
- certaines se touchent, d'autres non
Je souhaiterai obtenir une table qui agrège en une linestring toutes les linestring qui se touchent.
j'ai utilisé la requête proposée en remplaçant st_dwithin par st_touche. Mais je n'obtient pas le résultat attendu. Ainsi pour 3 linestring (1,2 et 3) qui se touchent j'obtiens
linestring 1
linestring 1+2
linestring 1+2+3
linestring 2 +3
alors que j’attends
linestring 1 +2 +3
Merci d'avance pour votre aide
Hors ligne
#11 Wed 01 February 2012 09:09
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 611
Re: postgis: fusion de polylignes (jointure)
Bonjour,
Si j'ai bien compris ce que vous demandez, j'opterai pour quelque chose du style :
Code:
select (st_dump(st_union(the_geom))).geom as the_geom from ma_table ;
Bonne journée,
Pascal PLUVINET
Hors ligne
#12 Wed 01 February 2012 10:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonjour,
Si j'ai bien compris ce que vous demandez, j'opterai pour quelque chose du style :Code:
select (st_dump(st_union(the_geom))).geom as the_geom from ma_table ;Bonne journée,
Bonjour,
Hmm, solution elegante. Mais je n'avais jamais remarqué que st_union sur des lignes qui se touchent ne crée pas une nouvelle ligne soudant les autres objets, mais plutot une MULTILINESTRING ou les elements constitutifs restent les "petites" lignes !
St_linemerge permet de "souder" ces lignes:
Code:
select (st_dump(st_linemerge(st_union(the_geom)))).geom from lines;
Nicolas
Hors ligne
#13 Fri 03 February 2012 10:52
- macdoc
- Participant occasionnel
- Date d'inscription: 31 Jan 2012
- Messages: 11
Re: postgis: fusion de polylignes (jointure)
Merci beaucoup cela fonctionne à merveille.
Cordialement,
Hors ligne
#14 Fri 03 February 2012 15:24
- macdoc
- Participant occasionnel
- Date d'inscription: 31 Jan 2012
- Messages: 11
Re: postgis: fusion de polylignes (jointure)
En fait lorsque cela bug lorsque les linestrings se croisent. De ce fait il faut travailler avec les extrémités et cela semble fonctionner
J'ai donc exécuté la requête suivante
select st_linemerge(st_collect(cs1.the_geom))
from (select the_geom, st_startpoint(cs_s.the_geom) as linepoint
from [ma-table] cs_s
UNION DISTINCT
select the_geom, st_endpoint(cs_e.the_geom) as linepoint
from [ma-table] cs_e
) as cs1
group by linepoint
having count(*) > 1
Hors ligne
#15 Mon 27 April 2015 23:12
- GAILLOT Alexis
- Participant actif
- Lieu: REMIREMONT
- Date d'inscription: 26 Mar 2009
- Messages: 53
Re: postgis: fusion de polylignes (jointure)
Bonsoir,
je m'intéresse au 1er sujet : fusion de polylignes non jointives, selon un critère de distance (5m, par ex).
Dans la solution de Nicolas, à propos de la phrase :
Le group by permet de garder les lignes correspondant au critere de proximité.
,
justement je ne vois pas de group by dans le code.
Je ne parviens pas à simuler l'exemple.
Ce sujet me semble très classique, avec de nombreuses application, du coup vu l'ancienneté des échanges, peut-être serait-il intéressant de relancer des échanges encore plus aboutis.
Alexis
Hors ligne
#16 Wed 18 November 2020 17:24
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Re: postgis: fusion de polylignes (jointure)
Bonjour,
je relance la discussion.
j'ai un cours d'eau avec des multilignes disjointes, forcément quand je fais un linemerge celui me renvoi la multiligne initiale.
Code:
select row_number () over(),cdeau_ppx1.topooh,st_linemerge(st_union(cdeau_ppx1.geom))as geom,cdeau_ppx1.code_ctxt from pdpg.cdeau_ppx1 group by cdeau_ppx1.code_ctxt,cdeau_ppx1.topooh order by geom desc
avez vous une solution?
Hors ligne
#17 Wed 18 November 2020 17:33
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonsoir,
S'il y a des espaces entre les lignes qui ne devraient pas etre là, il faut connecter les lignes proches entre elles (st_dwithin par ex pour chercher les candidats).
Il y a des ex il me semble sur le forum.
Vous auriez un exemple des data ?
Nicolas
Hors ligne
#18 Thu 19 November 2020 09:09
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Re: postgis: fusion de polylignes (jointure)
Bonjour, merci de votre réponse
oui je comprend, l'idée si je comprend bien est d'utiliser st_dump afin d'exploser la multiligne et vérifier avec dwithin si elles sont connectées.
ci joints les infos
Hors ligne
#19 Thu 19 November 2020 10:02
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonjour, merci de votre réponse
oui je comprend, l'idée si je comprend bien est d'utiliser st_dump afin d'exploser la multiligne et vérifier avec dwithin si elles sont connectées.
ci joints les infos
Bonjour,
oui c'est l'idée. Suivant la complexité des données, une construction WITH RECURSIVE peut etre utilisée pour itérer sur toutes les linestrings des multilinestrings, trouver leur plus proche voisin et le connecter.
Merci pour les data.
Nicolas
Hors ligne
#20 Thu 19 November 2020 10:27
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Si les lignes sont ordonnées comme il faut dans chaque multilinestring (ML), comme dans votre exemple, vous pouvez combler les gaps en dumpant les points de chaque ML et en reconstruisant une linestring avec: ca connecte alors tous les points:
Dump des ML en LN, puis dump des LN en points, puis construction d'un tableau des points ordonnés pour chaque LN à construire:
Code:
with tmp as ( select id, (st_dump(geom)).path[1] as idln, (st_dump(geom)).geom from testln ), tmp1 as ( select id, idln, (st_dumppoints(geom)).path[1] as idpt, (st_dumppoints(geom)).geom from tmp ) select id, st_makeLine(array_agg(geom order by idln, idpt)) as geom from tmp1 group by id;
Si les LN ne sont pas ordonnées, il faut les ordonner avant de les joindre. Pour cela, il y a une solution générique avec WITH RECURSIVE pour traiter ligne par ligne (pas mal d'exemples de cette construction sur le forum)
Nicolas
Dernière modification par Nicolas Ribot (Thu 19 November 2020 11:06)
Hors ligne
#21 Thu 19 November 2020 16:49
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Re: postgis: fusion de polylignes (jointure)
ok merci beaucoup cela fonctionne.
dernière question dans une ML, certaines lignes ont st_startpoint; st_endpoint similaire. je voudrais garder qu'une ligne sur les deux. l'idée si je ne me trompe pas est d'utiliser via st_makeline(st_startpoint(geom),st_endpoint (geom)) afin de voir les doublons mais comment réorganiser ensuite à travers le dump?
Hors ligne
#22 Thu 19 November 2020 17:48
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: postgis: fusion de polylignes (jointure)
Bonsoir,
startpoint/endpoint similaires, c'est dans la même linestring (ligne fermée), ou entre deux lignes de la collection (lignes se touchant sans gap) ?
Pour identifier les doublons, vous pouvez faire un group by geom (attention à votre dataset, car dans ce cas les bbox des géométries sont prises en compte: meme bbox => meme geom. Il faut donc etre sur que deux geom du dataset ne peuvent pas avoir la meme exacte bbox)
La requête que je vous ai donnée génère des doublons ?
Nicolas
Hors ligne
#23 Thu 19 November 2020 19:19
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Re: postgis: fusion de polylignes (jointure)
Non , j'ai juste un cas spécifique ci joint la ml et voici le dump
Code:
"idlin","startpt","endpt" 1,"POINT Z (477969.399999933 6758795.99999823 33.1)","POINT Z (475644.399999933 6760065.69999823 32.8)" 2,"POINT Z (478043.799999933 6758632.49999823 32.8)","POINT Z (477969.399999933 6758795.99999823 33.1)" 3,"POINT Z (478043.799999933 6758632.49999823 32.8)","POINT Z (477969.399999933 6758795.99999823 33.1)" 4,"POINT Z (481522.099999934 6758363.19999823 34.1)","POINT Z (478043.799999933 6758632.49999823 32.8)"
il s'agit donc dans ce cas de garder la ligne 2 ou 3 et de réutiliser via via st_makeline
Merci de votre aide
Hors ligne