#1 Wed 14 June 2017 16:21
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Fusion lignes entre deux points
Bonjour à tous,
J'ai deux couches: une couche ligne et une couche point.
Je souhaite fusionner des lignes qui se trouvent entre deux points. Je sais sur Qgis, il y a l'outil fusionner les entités, comme c'est manuelle je veux faire une requête permettant de l'automatiser.
Quelqu'un a une idée.
Merci de vos réponses.
Hors ligne
#2 Thu 15 June 2017 11:00
Re: Fusion lignes entre deux points
Salut,
St_Union ?
https://postgis.net/docs/ST_Union.html
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#3 Thu 15 June 2017 12:57
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Salut,
St_Union ?
https://postgis.net/docs/ST_Union.html
Bonjour, C'est bien la fonction st_union qu'il faut utilisé. Mais le problème c'est de trouver un moyen qui détecte d'abord toutes les lignes qui se trouvent entre deux point et ensuite faire le st_union. Donc je me suis bloqué à l'étape: trouver toutes les lignes qui se trouvent entre deux points.
Cordialement
Hors ligne
#4 Thu 15 June 2017 15:06
Re: Fusion lignes entre deux points
Utiliser d'abord un ST_Relate ?
http://www.postgis.org/docs/ST_Relate.html
Regarde la méthode with() pour d'abord chercher ces fameuses lignes et ensuite les fusionner
Dernière modification par heretik25 (Thu 15 June 2017 15:07)
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#5 Thu 15 June 2017 16:24
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Utiliser d'abord un ST_Relate ?
http://www.postgis.org/docs/ST_Relate.html
Regarde la méthode with() pour d'abord chercher ces fameuses lignes et ensuite les fusionner
Bonjour,
En effet, la fonction st_relate permet de voir les relations de géométrie, elle peut contribuer à solutionner mon problème. Le seul problème c'est au moment où je fais le parcours (avec la méthode with recursive) que j'arrive pas à fusionner les lignes sans point à leur extrémité. J'ai mis en pièce jointe le problème et la solution souhaitée.
Hors ligne
#6 Fri 16 June 2017 09:44
Re: Fusion lignes entre deux points
Bonjour, pourquoi ne pas tout fusionner et ensuite redécouper via les nœuds ?
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#7 Fri 16 June 2017 09:46
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: Fusion lignes entre deux points
Bonjour,
On ne sait pas vraiment le but métier de l'exercice mais ca n'enlève pas son intérêt.
Tu peux peut-être t'en sortir en accrochant les lignes "non accrochées" entre elles avec St_Snap si tu es capable de définir un seuil de tolérance.
Sinon, pour attribuer à chaque ligne, le couple de point auquel il correspond, tu pourrais créer un segment qui matérialise le couple de point (st_makeline) et faire un petit buffer et faire une relation entre ce buffer et tes lignes.
Difficile à expliquer! Le challenge m'intéresse mais j'ai peu de temps.
Pascal PLUVINET
Hors ligne
#8 Fri 16 June 2017 10:25
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Fusion lignes entre deux points
Bonjour,
Pouvez-vous nous décrire plus précisément les données, et notamment cette notion de "lignes entre deux points".
Il peut y avoir bcp de lignes entre deux points !
Dans votre exemple, il suffit juste de créer des lignes entre les points, non ?
Nico
Hors ligne
#9 Fri 16 June 2017 11:49
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Bonjour,
Pouvez-vous nous décrire plus précisément les données, et notamment cette notion de "lignes entre deux points".
Il peut y avoir bcp de lignes entre deux points !
Dans votre exemple, il suffit juste de créer des lignes entre les points, non ?
Nico
Bonjour Nicolas,
En fait j'ai une couche ligne et une couche point. Par exemple j'ai des lignes (par exemple ligne1,ligne2,ligne3,ligne4,ligne5) qui se trouvent entre deux points (point a et point b), en ce moment je cherche à fusionner ces cinq lignes pour que j'aie une ligne entre ces deux points. Je rappelle que le nombre de ligne entre deux points peut varié (minimum deux lignes). Dans mon exemple, j'ai montrer les lignes à fusionner (je les ai espace pour uniquement montrer que sont à fusionner, donc pas de problème de snap) en une seule ligne.
Hors ligne
#10 Fri 16 June 2017 11:53
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Bonjour, pourquoi ne pas tout fusionner et ensuite redécouper via les nœuds ?
Bonjour heretik25, je ne veux pas les fusionner puisse que je perds des informations qui se trouvent dans la couche ligne que je pourrais plus récupérer. S'il y a un moyen pour récupérer ces informations de chaque ligne, je suis preneur
Hors ligne
#11 Fri 16 June 2017 12:01
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Bonjour,
On ne sait pas vraiment le but métier de l'exercice mais ca n'enlève pas son intérêt.
Tu peux peut-être t'en sortir en accrochant les lignes "non accrochées" entre elles avec St_Snap si tu es capable de définir un seuil de tolérance.
Sinon, pour attribuer à chaque ligne, le couple de point auquel il correspond, tu pourrais créer un segment qui matérialise le couple de point (st_makeline) et faire un petit buffer et faire une relation entre ce buffer et tes lignes.
Difficile à expliquer! Le challenge m'intéresse mais j'ai peu de temps.
Bonjour ppluvinet,
Je tiens juste à rappeler que j'ai pas des problèmes de snap, c'est juste à titre d'information afin de montrer les lignes à fusionner Par contre ton idée de faire un st_makeline avec un buffer et regarder les lignes dans le buffer me parait une solution. Je vais le tester et voir.
J'ai testé ta méthode mais le souci est, avec la fonction st_makeline,il me crée beaucoup de ligne,y a t-il un moyen pour paramétrer ça afin qu’il me crée que des segments souhaiter.
Dernière modification par fassa222 (Tue 27 June 2017 14:15)
Hors ligne
#12 Tue 27 June 2017 14:10
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Fusion lignes entre deux points
Bonjour, quelqu'un pourra m’aider sur mon problème. j'avais penser à faire un parcours du réseau et fusionner les lignes qui n'ont pas point à leur extrémité mais le problème est comment faire la fusion des lignes au moment où je fais le parcours du réseau. Cdt
Hors ligne
#13 Mon 31 July 2017 16:34
- meonais
- Participant occasionnel
- Date d'inscription: 17 Jan 2017
- Messages: 35
Re: Fusion lignes entre deux points
Bonjour,
Je relance ce sujet afin de savoir s'il y a eu une solution apportée ?
Je pense avoir besoin de cette astuce pour mon jeu de données, que j'ai déjà commencé à traiter (et discuté avec vous) ici : https://georezo.net/forum/viewtopic.php?id=104853
J'ai donc une série de lignes (des portions de cours d'eau), auxquelles je "colle" des points (ptO). Pour l'instant, je découpe ensuite ces lignes avec ces points.
Le résultat est parfait, sauf que j'aurais besoin de n'obtenir qu'un tracé de cours d'eau entre chaque ptO; c'est à dire fusionner les lignes qui étaient déjà coupées avant la découpe par les ptO, et qui sont donc en deux (ou plus) morceaux entre mes ptO.
Sachant qu'entre certains ptO, la ligne est bien unique.
J'avais donc pensé à tout ce qui a été évoqué ici :
--->> avant de découper les lignes avec les ptO: fusionner toutes mes lignes de cours d'eau en une seule (st_union) pour ensuite découper uniquement au niveau des points, mais je perds des informations utiles sur les lignes ET je ne peux pas appliquer la découpe car j'obtiens une multilinestring au lieu d'une line
Code:
DROP TABLE IF EXISTS unionligne CASCADE; CREATE TABLE unionligne AS (SELECT ST_Union(geom) as geom FROM lignes_dumped -- couche sur laquelle un st_dump(geom).geom a été réalisé ); ALTER TABLE unionligne ADD COLUMN id SERIAL PRIMARY KEY; --- découpage -- Merci N.RIBOT sur Georezo :) -- premiere table des positions des points par rapport a "leurs" lignes DROP TABLE IF EXISTS locus CASCADE; CREATE TEMP TABLE locus as ( -- on genere la position du debut de la ligne (index 0) pour le premier segment à découper select l.id, 0 as l from unionligne l UNION ALL -- on genere la position de la fin de la ligne (index 1) pour le dernier segment à découper select l.id, 1 as l from unionligne l UNION ALL -- calcul des positions des points par rapport aux lignes select l.id, (st_linelocatepoint(l.geom, p.geom)) as l from unionligne l, ptO p where st_dwithin(l.geom, p.geom, 0.1) AND st_linelocatepoint(l.geom, p.geom) NOT IN (0,1) GROUP BY l.id, l order by id, l ); -- deuxieme table qui ajoute un index croissant par position croissante, pour permettre de faire la jointure plus tard sur elle-meme: DROP TABLE IF EXISTS loc_with_idx CASCADE; CREATE TEMP TABLE loc_with_idx as ( select id, l, rank() over (partition by id order by l) as idx from locus ) ; -- decoupage final de chaque ligne avec les positions des points sur la ligne, grace a st_line_substring-- DROP TABLE IF EXISTS splitang CASCADE; CREATE TABLE splitang AS (select l.id, l.gid, l.__gid , l.eu_cd , l.name , l.ssbv , l.nom , l.localisati , l.code_hydro , l.cd , st_linesubstring(l.geom, loc1.l, loc2.l) as geom from loc_with_idx loc1, loc_with_idx loc2, unionligne l where l.id = loc1.id and loc1.id = loc2.id and loc2.idx = loc1.idx+1 GROUP BY l.id, l.gid, l.__gid , l.eu_cd , l.name , l.ssbv , l.nom , l.localisati , l.code_hydro , l.cd , l.geom, loc1.l, loc2.l ); ALTER TABLE splitang ADD COLUMN idsplit SERIAL PRIMARY KEY;
Qui donne donc le message d'erreur suivant :
Code:
ERREUR: line_locate_point: 1st arg isn't a line ********** Erreur ********** ERREUR: line_locate_point: 1st arg isn't a line État SQL :XX000
--->> au lieu de découper les lignes avec les pt : créer une couche de points à partir des lignes de cours d'eau avec ST_DumpPoints() ; utiliser st_makeline() entre cette nouvelle couche de points et la couche pt (initialement de découpe, qui servirait ici de points d'extrémités) mais je n'arrive pas à identifier de champ de liaison /group by dans mes données...
Sachant que je peux récupérer toutes les infos de la ligne coupée par le pt sur la couche pt.
Mais ensuite, comment faire la jointure st_makeline(geom1, geom2)?
--->> après la découpe des lignes (splitang) avec les pt : fusionner les lignes situées entre les pt ...
J'ai normalement réussi à identifier les lignes "orpheline" de pt à l'une ou aux deux extrémités (= celles à fusionner entre elles si une de leur extrémité sans pt est proche d'une autre) avec les requêtes suivantes :
Code:
DROP TABLE IF EXISTS extremsplita CASCADE; CREATE TEMP TABLE extremsplita AS ( SELECT 'a'||(row_number() over()) as idextrem, idsplit, __gid , ST_LineInterpolatePoint(s.geom, 0) as geom FROM splitang s); DROP TABLE IF EXISTS extremsplitb CASCADE; CREATE TEMP TABLE extremsplitb AS ( SELECT 'b'||row_number() over() as idextrem, idsplit, __gid , ST_LineInterpolatePoint(s.geom, 1) as geom FROM splitang s ); SELECT a.idsplit , a.idextrem as a,oa.snapcd, b.idextrem as b, ob.snapcd, l.geom FROM splitang l LEFT OUTER JOIN extremsplita a ON l.idsplit = a.idsplit LEFT OUTER JOIN ptO oa ON ST_Dwithin(oa.geom, a.geom, 0.1) LEFT OUTER JOIN extremsplitb b ON l.idsplit = b.idsplit LEFT OUTER JOIN ptO ob ON ST_Dwithin(ob.geom, b.geom, 0.1) WHERE (oa.snapcdu IS NULL OR ob.snapcd IS NULL) GROUP BY a.idsplit , a.idextrem,oa.snapcd, b.idextrem, ob.snapcd, l.geom
Maintenant je ne sais pas comment "fusionner" ces lignes entre elles en une entité, seulement si elles partagent un point d'extrémité en commun (st_dwithin(..... 0.1) ?) ET qu'elles ont au PLUS un pt à leur extrémité, afin d'obtenir plusieurs entité de lignes groupées...
Pensez-vous qu'une ou l'autre méthode serait la plus adaptée ?
Avez-vous une ou plusieurs idées pour la /les développer ?
Merci d'avance pour vos retours !
Dernière modification par meonais (Mon 31 July 2017 16:42)
Hors ligne
#14 Tue 01 August 2017 09:30
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Fusion lignes entre deux points
Bonjour,
Bonjour Nicolas,
En fait j'ai une couche ligne et une couche point. Par exemple j'ai des lignes (par exemple ligne1,ligne2,ligne3,ligne4,ligne5) qui se trouvent entre deux points (point a et point b), en ce moment je cherche à fusionner ces cinq lignes pour que j'aie une ligne entre ces deux points. Je rappelle que le nombre de ligne entre deux points peut varié (minimum deux lignes). Dans mon exemple, j'ai montrer les lignes à fusionner (je les ai espace pour uniquement montrer que sont à fusionner, donc pas de problème de snap) en une seule ligne.
En topologie il s'agit d'arcs ayant les mêmes nœuds mais pas les mêmes sommets.
J'utiliserai la topologie sous postgis pour gérer ce genre de chose.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne