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

Hors ligne

 

Pied de page des forums

Powered by FluxBB