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