#1 Wed 24 September 2014 10:27
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
POSTGIS : fusion de LINESTRING
Bonjour à tous,
Je bloque sur un sujet épineux.
Je doit fusionner deux linestring entre elles. Ces linestring possèdent une partie commune que j'aimerais conserver.
par exemple :
Code:
'LINESTRING(1 1,2 1,2 2)' 'LINESTRING(2 2,2 1,3 1)'
Je dois fusionner ces deux parties et idéalement obtenir une linestring comme ceci
Code:
'LINESTRING(1 1,2 1,2 2,2 1,3 1)'
On voit bien ici que la partie 2 1, 2 2, 2 1 est superposée. Cela ne pose pas de problème à Postgis lorsque l'on crée ce type de géométrie
Code:
SELECT st_astext(ST_GeometryFromText('LINESTRING(1 1,2 1,2 2,2 1,3 1)'));
resultat => "LINESTRING(1 1,2 1,2 2,2 1,3 1)"
Voila comment je m'y prends pour fusionner ces deux lignes :
Code:
select st_astext(st_linemerge(st_union((ST_GeometryFromText('LINESTRING(1 1,2 1,2 2)')),(ST_GeometryFromText('LINESTRING(2 2,2 1,3 1)')))))
résultat =>"MULTILINESTRING((1 1,2 1),(2 1,3 1),(2 1,2 2))"
et ensuite je dois repasser le résultat en linestring obligatoirement dans mon process de calcul d'itinéraire avec pgrouting
Code:
select st_astext((st_dump((st_linemerge(st_union((ST_GeometryFromText('LINESTRING(1 1,2 1,2 2)')),(ST_GeometryFromText('LINESTRING(2 2,2 1,3 1)'))))))).geom)
résultat =>
"LINESTRING(1 1,2 1)"
"LINESTRING(2 1,3 1)"
"LINESTRING(2 1,2 2)"
ma ligne est éclatée en 3 morceaux. Cette requête de fusion de ligne fonctionne parfaitement lorsqu'il n'y a pas de superposition ou de boucle.
Je ne me vois pas passer en revue les coordonnées de chacune de mes linestring pour identifier les superpositions et venir trafiquer des coordonnées...ne serait ce que pour une question de temps.
il existe peut être un opérateur qui m'aurait échappé ou une manière de faire plus appropriée. Merci de vos suggestions.
Nicolas GRANIER
POSTGRESQL 9.1/POSTGIS 2/PGROUTING 1.5
Hors ligne
#2 Wed 24 September 2014 11:38
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : fusion de LINESTRING
Bonjour Nicolas,
C'est l'operateur st_union qui "node" les lignes aux intersections, de par sa définition. (ca peut d'ailleurs etre bien pratique dans certains cas)
Pour garder la ligne initiale, il faut juste collecter les lignes avant le merge, sans en faire l'union:
Code:
with lines as ( values (ST_GeometryFromText('LINESTRING(2 2,2 1,3 1)')), (ST_GeometryFromText('LINESTRING(1 1,2 1,2 2)')) ) select st_astext(st_linemerge(st_collect(column1))) from lines; => LINESTRING(1 1,2 1,2 2,2 1,3 1)
Nicolas
Hors ligne
#3 Wed 24 September 2014 12:02
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : fusion de LINESTRING
Pour le routing, tu ne veux pas que le point (2, 1) soit un noeud et donc qu'il y ait bien 3 lignes partageant ce noeud ?
Hors ligne
#4 Wed 24 September 2014 14:00
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: POSTGIS : fusion de LINESTRING
Bonjour Nicolas, merci de ta réponse.
Le st_collect, je n'y avais pas pensé !
c'est parfait.
Par rapport à ta question sur le routing, c'est en réalité pas tellement un problème de géométrie d'avoir 3 objets mais c'est un problème de logique de réseau par rapport aux données. Je travaille sur des données télécom et il FAUT que les artères que j'ai identifiées soient fusionnées.
Merci encore
Dernière modification par Nicolas Granier (Wed 24 September 2014 14:21)
Hors ligne
#5 Wed 24 September 2014 15:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : fusion de LINESTRING
ok
Hors ligne