Pages: 1
- Sujet précédent - Obtenir les derniers sommets (extrémités) d'une LineString - Sujet suivant
#1 Tue 01 June 2021 10:11
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Obtenir les derniers sommets (extrémités) d'une LineString
Bonjour,
A partir d'un point de départ, je souhaiterais obtenir une zone de desserte de 4km, avec comme poids le dénivelé de chaque tronçon de route (connaitre les trajets qui me permettront de circuler 4km en passant par les routes les moins dénivelées). Débutant dans la matière, voici comment je me vois procéder :
- Obtenir la zone de desserte de 4km avec PgRouting (pgr_drivingDistance), avec comme seul poids celui de la distance afin d'observer jusqu'où je peux aller en partant de mon point.
- Extraire les derniers sommets (extrémités) de la couche obtenue, qui seront les points à atteindre en partant du départ.
- Calculer les trajets les plus "courts" (pgr_dijkstra : 1 à N) en utilisant le poids du dénivelé de chaque tronçon de route, de mon poids de départ à chaque sommet obtenue avec la précédente requête.
J'ai réussi à obtenir ma zone de desserte avec cette requête :
Code:
select * from pgr_drivingDistance( 'select id, source, target, st_length(geom) as cost FROM road', 131, 4000, false)
Ce qui me donne cette couche (en pièce jointe), du type LineString avec 2402 entités : https://zupimages.net/viewer.php?id=21/22/b12b.png
La prochaine étape serait donc d'obtenir les "st_endpoint" de ma couche, pour obtenir les points à atteindre avec pgr_dijkstra de mon point de départ. Malheureusement, je n'y arrive pas. Evidement, calculer le st_endpoint de ma couche reviendrait à extraire le dernier sommet de chaque tronçon de route, ce qui ne me convient pas.
Est-il possible de réaliser ceci sur PostGis ?
Un grand merci.
Dernière modification par preliator (Tue 01 June 2021 10:18)
Hors ligne
#2 Tue 01 June 2021 11:01
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Obtenir les derniers sommets (extrémités) d'une LineString
Bonjour,
Pour trouver les points terminaux de votre réseau, c'est a dire les points non connectés, vous pouvez extraire les startpoints et endpoints du réseau (ce sont les candidats à traiter) et faire un GROUP BY geom pour identifier les groupes a plusieurs points (les connexions du réseau) et les groupes avec un seul point (points terminaux).
GROUP BY geom se sert de la bbox de la geom et pas la de la geom elle-même. Si le réseau est mal connecté (ce qui n'est pas le cas chez vous puisque vous faites du routing avec), vous pouvez faire un GROUP BY st_expand(geom, precision) pour coller artificiellement les points plus proches que "precision":
Ici la requête sort l'id de la ligne, true ou false pour dire si le point terminal est un startpoint ou endpoint, et la geom du point.
Code:
with tmp as ( select id as idline, true as startpt, st_startpoint(geom) as geom from desserte UNION ALL select id as idline, false as startpt, st_endpoint(geom) as geom from desserte ) select (array_agg(idline))[1] as id, (array_agg(startpt))[1] as startpt, geom from tmp group by geom having count(*) = 1;
Nicolas
Hors ligne
#3 Tue 01 June 2021 11:13
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: Obtenir les derniers sommets (extrémités) d'une LineString
C'est génial, cela répond entièrement à mon besoin. Merci.
Hors ligne
Pages: 1
- Sujet précédent - Obtenir les derniers sommets (extrémités) d'une LineString - Sujet suivant