Pages: 1
- Sujet précédent - Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre] - Sujet suivant
#1 Wed 15 March 2017 11:37
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Bonjour,
Je me permet de reposter le thread de CorentinLC du 20/01/2017 ici ==> https://georezo.net/forum/viewtopic.php?id=104800 , mais avec une légère variation du point bloquant.
J'ai une couche points qui représente des chambres télécoms et une couche de lignes qui traverse ces chambres, les câbles. On me demande de définir le réseau à partir d'une chambre en prenant en compte le fait que le réseau doit ne pas excéder trois chambres traversées.
Cependant, quand les communes sont importantes, il y a beaucoup de possibilités, et il faut arriver à sélectionner pour chaque chambre tous les tronçons concernés, qui sont présents à N+3 (ou 5) N étant la chambre d'où le réseau part.
Ci dessous une capture pour éclaircissement.
Je me retrouve coincée aujourd’hui pour réaliser cette manipulation dans Postgis. Auriez vous des pistes de réflexion, outils ?
Merci d’avance pour votre aide,
Bonne journée,
Marine.
Dernière modification par bruhnild (Wed 15 March 2017 12:12)
Hors ligne
#2 Wed 15 March 2017 12:04
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Bonjour,
Vous avez plusieurs solutions avec Postgis:
• Convertir votre modele en topologie (cf. http://postgis.net/docs/Topology.html) et travailler avec les arcs et sommets traversés
• Ecrire une requete recursive (Recursive CTE: https://www.postgresql.org/docs/9.6/sta … with.html) qui parcours le réseau de câbles à partir d'une chambre et s'arrête après n chambres traversées.
Nico
ps: dans votre image, les 3 câbles du bas ne devraient-ils pas être annotés "N+2" ?
Hors ligne
#3 Wed 15 March 2017 12:13
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Merci pour les pistes, il y avait effectivement une coquille dans la capture, je l'ai corrigée, merci de l'avoir relevée!
Hors ligne
#4 Wed 15 March 2017 13:09
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Bonjour,
Vous pourriez peut-être trouver une solution avec pgRouting (une autre extension pour PostgreSQL)
Il me semble que la fonction pgr_drivingDistance fera l'affaire:
http://docs.pgrouting.org/2.0/fr/src/dr … g-distance
Vous auriez à bâtir d'abord un réseau pgRouting à partir de vos géométries PostGIS.
Daniel
Hors ligne
#5 Wed 15 March 2017 13:49
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Avec une requete recursive, ca donnerait qqch comme:
La table cable contient les cables, connectés aux chambres (table room): un cable part d'une chambre et arrive dans une chambre.
Par exemple, pour trouver tous les cables partant de la chambre d'id=1:
• La premiere partie de la requete trouve tous les cables partant de la chambre de départ et connectés a des chambres (geomroom)
• la deuxieme partie, récursive, cherche tous les cables connectés aux chambres trouvées à l'étape précédente.
Ici, la requete ne prend donc pas en compte des cables partant d'une chambre, connectés à aucune chambre.
Code:
with recursive tmp as ( select r.id as id_chambre_src, c.id as id_cable, 1::int as step, array[r2.id] as idrooms, r2.geom as geomroom from room r join cable c on st_dwithin(st_boundary(c.geom), r.geom, 0.001) --lien entre la chambre de départ et un câble join room r2 on st_dwithin(st_boundary(c.geom), r2.geom, 0.001) -- lien entre un cable et sa chambre d'arrivée -- id chambre de départ where r.id = 1 and r2.id <> 1 UNION ALL -- selection des cables connectés aux chambres courantes, select t.id_chambre_src, c.id, step+1, t.idrooms||r.id, r.geom from cable c join tmp t on st_dwithin(st_boundary(c.geom), t.geomroom, 0.001) join room r on st_dwithin(st_boundary(c.geom), r.geom, 0.001) where c.id <> t.id_cable and not (r.id = any(t.idrooms)) -- on ne prend pas les câbles et les chambres déjà traitées (condition de stop de la récursion) ) select * from tmp;
Pour trouver les cables connectés a N chambres de la chambre de départ:
with recursive .... (
) select * from tmp
where step < N;
Ex avec les données de l'image:
Code:
id_chambre_src id_cable step idrooms 1 2 1 {5} 1 4 1 {2} 1 6 1 {3} 1 16 1 {6} 1 8 2 {3,4} 1 10 2 {6,7}
Nicolas
Hors ligne
#6 Wed 15 March 2017 13:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Pour une telle problématique de réseau (surement orienté), je vous conseille vivement de passer en topologie, histoire d'avoir des arcs (cables) et des noeuds (chambres) avec des relations explicites entre eux.
(il y a qq messages sur ce forum qui indiquent comment passer d'un modèle objet à un modèle topologique avec postgis.)
Nicolas
Hors ligne
#7 Wed 15 March 2017 15:48
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Merci pour le gros coup de pouce, c'est exactement ce que je voulais obtenir, et même plus!
Marine.
Hors ligne
#8 Tue 04 April 2017 17:05
- fassa222
- Participant occasionnel
- Date d'inscription: 18 Jan 2012
- Messages: 36
Re: Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre]
Pour une telle problématique de réseau (surement orienté), je vous conseille vivement de passer en topologie, histoire d'avoir des arcs (cables) et des noeuds (chambres) avec des relations explicites entre eux.
(il y a qq messages sur ce forum qui indiquent comment passer d'un modèle objet à un modèle topologique avec postgis.)
Nicolas
Bonjour Nicolas, Votre idée m’intéresse beaucoup. Du coup es ce que vous avez un exemple de création de topologie avec l'insertion d'une géométrie. J'ai compensé à rechercher mais je pige pas grande chose, puisse que je suis nouveau sur postgis. J'ai meme regardé le lien que vous avez postez mais pas grande chose, j'ai réussi à créer une topologie mais j'arrive pas a inserer une géométrie dans la topologie Merci de votre réponse
Hors ligne
Pages: 1
- Sujet précédent - Selection ligne à N+3 d'un noeud [Postgis ou autre solution libre] - Sujet suivant