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

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: Fusion lignes entre deux points


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

heretik25 a écrit:

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

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

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

heretik25 a écrit:

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.


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

Hors ligne

 

#6 Fri 16 June 2017 09:44

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

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

Nicolas Ribot a écrit:

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

heretik25 a écrit:

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

ppluvinet a écrit:

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

 

Pied de page des forums

Powered by FluxBB