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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

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

Re: postgis: fusion de polylignes (jointure)

Anaïs Just a écrit:

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 wink )
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: 1554

Re: postgis: fusion de polylignes (jointure)

Anaïs Just a écrit:

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 smile )


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

Re: postgis: fusion de polylignes (jointure)

Anaïs Just a écrit:

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à big_smile

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

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

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

Re: postgis: fusion de polylignes (jointure)

ppluvinet a écrit:

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 ! yikes

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

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#19 Thu 19 November 2020 10:02

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: postgis: fusion de polylignes (jointure)

Ricola62 a écrit:

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

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

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB