#1 Mon 13 December 2010 12:23
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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: 1554
Re: 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,
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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: 1554
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
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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