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

GEODATA DAYS 2024

#1 Mon 13 December 2010 12:23

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 610

POSTGIS : traitement du réseau avant Pgrouting

Bonjour,

j'ai un réseau de routes (LINESTRING) et j'aimerais
1. Rajouter un noeud quand deux routes se croisent, 
2 .que chaque ligne de ma table soit un segment allant d'un vertex à un autre.
Ce réseau sera utilisé par PGrouting.


Pour avoir les noeud des routes qui se croisent (question 1), j'ai créé déjà une couche nod1 comme ci-après mais je ne sais pas coupé une route en deux en fonction d'un point:

Code:

drop table nod1;
Create table pgrout.nod1 as 
select distinct st_intersection(a.the_geom,b.the_geom) as the_geom
from reso_ok2 a,reso_ok2 b
where st_intersects(a.the_geom,b.the_geom) and a.gid != b.gid
;
alter table pgrout.nod1 add column gid serial;
delete from nod1 where geometrytype(the_geom) != 'POINT';

Merci d'avance,


Pascal PLUVINET

Hors ligne

 

#2 Mon 13 December 2010 12:40

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1538

Re: POSTGIS : traitement du réseau avant Pgrouting

ppluvinet a écrit:

Bonjour,

j'ai un réseau de routes (LINESTRING) et j'aimerais
1. Rajouter un noeud quand deux routes se croisent, 
2 .que chaque ligne de ma table soit un segment allant d'un vertex à un autre.
Ce réseau sera utilisé par PGrouting.


Pour avoir les noeud des routes qui se croisent (question 1), j'ai créé déjà une couche nod1 comme ci-après mais je ne sais pas coupé une route en deux en fonction d'un point:

Code:

drop table nod1;
Create table pgrout.nod1 as 
select distinct st_intersection(a.the_geom,b.the_geom) as the_geom
from reso_ok2 a,reso_ok2 b
where st_intersects(a.the_geom,b.the_geom) and a.gid != b.gid
;
alter table pgrout.nod1 add column gid serial;
delete from nod1 where geometrytype(the_geom) != 'POINT';

Merci d'avance,


Bonjour,

Les fonctions de referencement lineaires sont utiles pour ca: line_interpolate_point, line_locate_point, line_substring
Sinon, pgRouting a des routines pour faire ca a partir de tables postgis.

Je vous joins un ex de requete de requetes qui fait ca:

Code:

select st_lineMerge(
    st_collect(
        st_line_substring(s.the_geom, 0, p.locus),
        st_line_substring(s.the_geom, p.locus, 1)
        )
    )
from streets s, projected_nodes p
where s.gid = p.street_id;

Ici, la table projected_nodes contient les nouveaux points a inclure dans les lignes, avec comme identifiant l'id de la ligne sur laquelle tombe le point.
Locus est un attribut, calculé avec line_interpolate_point et represente la fraction de la position du point sur la ligne.

la requete decoupe la ligne avec le nouveau point, et reconstruit les deux lignes => insertion du point.

Nicolas

Hors ligne

 

#3 Mon 13 December 2010 13:57

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 610

Re: POSTGIS : traitement du réseau avant Pgrouting

Sinon, pgRouting a des routines pour faire ca a partir de tables postgis.


S'agit-il de fonctions? Auriez-vous le noms de ces fonctions? Merci


Pascal PLUVINET

Hors ligne

 

#4 Mon 13 December 2010 14:25

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1538

Re: POSTGIS : traitement du réseau avant Pgrouting

ppluvinet a écrit:

Sinon, pgRouting a des routines pour faire ca a partir de tables postgis.


S'agit-il de fonctions? Auriez-vous le noms de ces fonctions? Merci


Non pardon, my bad: pgRouting a des routines pour associer les bons identifiants de noeuds au reseau, pas pour inserer de nouveaux points dans le reseau.

Il faudra le faire par requete depuis postgresql.
Une fois les nouveaux points crées, et surtout un lien vers le segment auquel ils appartiennent, le decoupage est relativement aisé.

Nicolas

Hors ligne

 

#5 Mon 13 December 2010 16:38

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 610

Re: POSTGIS : traitement du réseau avant Pgrouting

Voici comment je suis arrivé à découpé mon réseau pour avoir seulement de segment allant d'un vertex à un autre :

Code:

--- créer les vertex
drop table if exists nodes_reso;
SELECT a.gid as tronc, 
 ST_PointN(the_geom, generate_series(1, ST_NPoints(the_geom)-1)) as nod1,
 ST_PointN(the_geom, generate_series(2, ST_NPoints(the_geom))) as nod2 
into pgrout.nodes_reso FROM reso_ok2 a;

alter table nodes_reso add column loc1 numeric;
alter table nodes_reso add column loc2 numeric;
update nodes_reso a set
loc1 = ST_Line_Locate_Point(b.the_geom, nod1),
loc2 = ST_Line_Locate_Point(b.the_geom, nod2)
from reso_ok2 b where a.tronc = b.gid;

--- Recréer le réseau découpé par les vertex
drop table reso_decoup;
create table pgrout.reso_decoup as 
select a.tronc, b.timestamp,
ST_Line_Substring(b.the_geom, a.loc1,a.loc2) as the_geom
from nodes_reso as a, reso_ok2 as b
where  a.tronc = b.gid and a.loc1 < a.loc2;

Merci Nocolas pour m'avoir mis sur la piste.


Pascal PLUVINET

Hors ligne

 

Pied de page des forums

Powered by FluxBB