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 Mon 03 July 2017 12:36

felixd
Participant occasionnel
Date d'inscription: 20 Jun 2017
Messages: 46

[POSTGIS] Continuité d'un réseau

Bonjour,

Je souhaiterais contrôler la continuité d'un réseau de polyligne. Voila ce que j'ai commencé à écrire :


select br.*, 'non connecté' as err_geom
from reseau_eau.conduite br
where br.code_sig not in (
    select b.code_sig
    from reseau_eau.conduite b, (select d.code_sig, d.geom from reseau_eau.conduite d) c
    where st_touches(b.geom, c.geom))
order by code_sig

Mais le résultat n'est pas tout a fait celui escompté. Cela me donne uniquement les lignes qui sont déconnectées de part et d'autre. Hors il me faudrait aussi qui n'ont qu'une seul extémité deconnecté. (genre trou dans le réseau)

Merci de votre aide

Hors ligne

 

#2 Mon 03 July 2017 13:09

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

Re: [POSTGIS] Continuité d'un réseau

Bonjour,

Vous pouvez tester les extrémités des lignes plutot que les lignes elles-memes: st_boundary(linestring) renvoie la frontière de la ligne: ses points de départ et d'arrivée.
Avec un NOT EXISTS plutôt qu'un NOT IN (plus performant):

Code:

select br.*, 'non connecté' as err_geom
from reseau_eau.conduite br
where not exists (
  select null 
  from reseau_eau.conduite b 
  where b.code_sig <> br.code_sig 
  and b.geom && br.geom 
  and st_dwithin(br.geom, st_boundary(b.geom), 0.1)
);

Nicolas

Hors ligne

 

#3 Mon 03 July 2017 13:41

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

Re: [POSTGIS] Continuité d'un réseau

Hmm pardon suis allé un peu vite:
la requête précédente est la même que la vôtre smile

Pour trouver les linestrings déconnectées à une extrémité, vous pouvez extraire ces extrémités, puis les tester avec les conduites:
Si l'id apparait 2 fois, la ligne est déconnectée entièrement, sinon, sur une seule extrémité.
(vous pouvez ajouter un flag dans le premier WITH pour savoir si la ligne est déconnectée au startpoint ou au endpoint):

Code:

with tmp as (
  select r.code_sig, st_startpoint(r.geom) as geom
  from reseau_eau.conduite r
  union all
  select r.code_sig, st_endpoint(r.geom) as geom
  from reseau_eau.conduite r
) select t.code_sig
from tmp t
where not exists (
  select null
  from route r
  where t.code_sig <> r.code_sig
    and st_dwithin(r.geom, t.geom, 0.1)
);

(vous pouvez aussi passer par:
with tmp as (
  select r.gid, (st_dump(st_boundary(geom))).geom, r.geom as fg
  from route r
) plutot que de faire un union all.)

Adaptez la valeur de st_dwithin suivant vos données. L'avantage de cette fonction est qu'elle permet de contourner les pb de précision qu'on rencontre avec st_touches par ex.

Nicolas

Hors ligne

 

#4 Mon 03 July 2017 14:16

fassa222
Participant occasionnel
Date d'inscription: 18 Jan 2012
Messages: 36

Re: [POSTGIS] Continuité d'un réseau

Bonjour,
j'avais un exemple que j'avais fais. Ci-dessous vous trouverez le code. Et pour connaitre les lignes qui n'ont pas de connexion il suffit de faire une jointure.

Code:

WITH RECURSIVE troncon AS (
-- partie non recursive: choix du troncon initial
 SELECT cd_code origine,cd_code, cd_code extremite,ARRAY [cd_code] ids, geom, 1 AS iter
 FROM lignes
 ---Choix de la Ligne de depart
 WHERE cd_code = 'CD05'
 UNION ALL
 -- partie recursive
 SELECT t.extremite,r.cd_code, r.cd_code,ids || r.cd_code, r.geom, t.iter + 1
 FROM troncon t, lignes r
 WHERE NOT (r.cd_code = ANY (t.ids))
 --- condition sur la continuite de la ligne: lextrmite de mon reseau doit correspondre a celui de mon parcours
 AND st_dwithin(st_boundary(r.geom), t.geom, 1)
) SELECT * FROM troncon t;

Hors ligne

 

#5 Mon 03 July 2017 14:45

felixd
Participant occasionnel
Date d'inscription: 20 Jun 2017
Messages: 46

Re: [POSTGIS] Continuité d'un réseau

Excellent MERCI

moi qui ne pratique pas le "where not exists" et encore  moins le "with"

c'est une leçon

Merci

Hors ligne

 

#6 Mon 03 July 2017 15:02

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: [POSTGIS] Continuité d'un réseau

Salut,

pour rebondir sur le Not In vs Not Exists,
https://stackoverflow.com/questions/224 … re-is-null

Hors ligne

 

Pied de page des forums

Powered by FluxBB