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


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

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


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

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

 

Pied de page des forums

Powered by FluxBB