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

Printemps des cartes 2024

#1 Wed 04 November 2020 17:30

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

[postgis3]Pgrouting : problème de pgr_withpointsDD

Aloha

Je souhaite calculer une propagation depuis des sources en utilisant mon graphe. In extenso, où se situent les limites d'un isochrone pour chacune des sources. Les sources ne sont pas sur le graphe, mais en dehors.

Je crée mon graphe sans problème.
Je crée une table contenant les données de rattachement de mes sources au graphe

Code:

create table exo.psource as 
(with poi as (
    select p.gid as gid_pt, 
        p."q (m3/h)" as debit, 
        p.volume as volume, 
        p.geom  
    from exo.epi  p
    )
SELECT
    poi.gid_pt::int4,
    poi.volume::int8, 
    poi.debit::int4,
    closest_tr.gid::int4,
    closest_tr.dist::double precision,
    st_linelocatepoint(closest_tr.geom, poi.geom)::double precision as fraction
FROM poi
LEFT JOIN LATERAL 
    (SELECT
        t.gid, 
        ST_Distance(t.geom, poi.geom) as dist,
        t.geom
    FROM exo.troncon t 
    ORDER BY poi.geom <-> t.geom
    LIMIT 1
    ) AS closest_tr
ON TRUE
)

Après j'exécute la requête suivante pour récupérer les sommets situés à moins de 200m de mes sources :
(Je me suis inspiré de ces articles, j'ai utilisé :
présentation foss4g
une question sur gis stackeexchange
un post de bostongis
article sur geoafrica
)

Code:

select 
    pgr.*, 
t   vp.the_geom 
from
pgr_withPointsDD(
    'select gid AS id, nsource::int4 AS source, ncible::int4 AS target, st_length(geom)::float8 AS cost, st_length(geom)::float8 as reverse_cost 
    from exo.troncon'::text, 'select gid_pt as pid, gid as edge_id, fraction from exo.source'::text, 
    (
        select
            array_agg(exo.source.gid_pt order by gid_pt asc) from exo.source
    ) , -- un array de tous les id de mes sources
    200
,
    details := true
    ) pgr
left join exo.troncon_vertices_pgr tvp on tvp.id = pgr.node

Le résultat semble correct lorsque je l'affiche dans mon sig (préféré) (cf capture).
Sauf que pour quelques sources, je vois bien que le tronçon le plus proche n'a pas été parcouru dans les deux sens et que des sommets qui devraient ressortir en résultat n'y sont pas.


Qu'ai-je loupé ?

Aucun sommet n'étant situé pile à la distance demandée, comment ajouter les parties de tronçons supplémentaires pour arriver à la distance exacte ?
Mes sources sont elles même à une certaine distance des tronçons, comment exploiter l'information dist de la table pour réduire d'autant la distance parcourue sur les tronçons ?

Je suis sûr que la solution à ce problème pourrait bénéficier à plein de personnes qui ont à résoudre ce type de problème.

D'avance, merci pour vos conseils

Dernière modification par Pierre (Wed 04 November 2020 17:34)


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

art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

Pied de page des forums

Powered by FluxBB