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 Thu 04 April 2013 09:11

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Quand ST_Collect rend-t-elle un Multilinestring ?

Bonjour,

Mon problème est le suivant :

J'utilise Postgis.

J'ai besoin de créer un chemin entre plusieurs points origines et destinations.

Première méthode: je crée des lignes (Makeline) directement entre les points O/D successifs, puis j'applique la fonction ST_Collect sur ces bouts de chemins pour avoir le chemin complet. Le type de résultat obtenu est Multilinestring .

Deuxième méthode: j'ai un réseau routier. J'applique avec pgrouting la fonction de création du plus court chemin (shortest_path) ce qui me rend des bouts de segments du réseau (type Line normalement) puis j'applique la même fonction ST_Collect sur cet ensemble de segments. Sauf que là, le résultat est de type Geometrycollection.

Quel est e problème me diriez vous?

Le problème est qu'avec un geometrycollection je ne peut pas visualiser ces chemins sur un sig (qgis par exemple), ni appliquer (apparemment) des opérations de relations spatiales tels que crosses ou intersects.


Donc : puis je forcer ST_collect à retourner un Multinestring? ou existe-il une astuce pour remédier à ce problème?

Merci à vous.

Hors ligne

 

#2 Thu 04 April 2013 10:08

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

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Bonjour,

Le type de la collection retournée par st_collect depend des données a collecte: si elles sont heterogènes: lignes, points, geometries vides, alors une GeometryCollection sera créée.
Si les données sont homogènes: que des points, des lignes... alors une collection de ce type sera créée.

Pour filtrer une geometryCollection, il y a plusieurs methodes, mais st_dump est pratique: cela permet d'exploser une collection en objets simples, par exemple:

Code:

-- recrée une collection d'objets homogènes
with explosion as (
    select st_dump(macollection) as d
    from matable
) 
select st_collect( (d).geom ) as nouvelle_collection_linestring
from explosion
where geometryType( (d).geom ) = 'LINESTRING';

Il y a d'autres méthodes.

Il est aussi évidemment possible de faire le meme controle lors de l'appel a st_collect, en ajoutant une clause where permettant de filtrer le type d'objet qu'on souhaite collecter.

Du fait des cas possibles rencontrés lors d'opérations topologiques, il est tjs interessant de controler explicitement les resultats obtenus pour controler le type des données.

Nicolas

Hors ligne

 

#3 Thu 04 April 2013 11:25

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Re bonjour Nicolas,

Merci pour la réponse.

J'applique St_Collect sur un tableau de géométries , toutes de type Multilinestring. Le résultat ne devrait-il pas être un Multilinetring, plutôt qu'un GEOMETRYCOLLECTION?

C'est ce que je trouve bizarre!

Hors ligne

 

#4 Thu 04 April 2013 11:34

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

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Vraiment toutes de type LINESTRING ?
Il n'y en aurait pas une qui serait un point ou une GEOMETRY EMPTY ?

Si ce n'est pas le cas, oui c'est curieux.

Nicolas

Hors ligne

 

#5 Thu 04 April 2013 11:51

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Ouiiii toutes de type MULTILINESTRING (et non pas LINESTRING).

Je stocke ces géométries dans un tableau de type geometry[]. PAr la suite j'applique la fonction ST_Collect avec comme seul argument ce tableau.
Et le résultat est un GEOMETRYCOLLECTIN! :-(

Hors ligne

 

#6 Thu 04 April 2013 12:04

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

J'ai  appliqué le code st_dump.

J'obtiens une "explosion" de Linestring, certes . mais quand j'applique le ST_Collect , comme dans le code, je n'obtiens rien comme résultat!

Hors ligne

 

#7 Thu 04 April 2013 13:30

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

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Pouvez-vous poster votre requete ?

(Sinon, relisant la doc 2.0, je vois cette fonction, plutot que le test proposé:
st_collectionExtract (http://postgis.net/docs/manual-2.0/ST_C … tract.html)

Nicolas

Hors ligne

 

#8 Thu 04 April 2013 13:43

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

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

Concernant st_collect, et relisant la doc: il est normal d'obtenir une geometryCollection a partir d'objets MULTI, c'est le comportement par défaut:

Geometries simples et homogènes passées a st_collect => MULTI*
Geometries MULTI et/ou hétérogènes passées a st_collect => GEOMETRY COLLECTION

Normal, donc.

Nicolas

Hors ligne

 

#9 Thu 04 April 2013 16:44

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Quand ST_Collect rend-t-elle un Multilinestring ?

oui. C'est ce que j'ai compris aussi.

Là, j'ai remplacé l'utilisation de ST_collect par St_Union  (qui a d'après ce que j'ai compris le même comportement) et j'obtiens normalement un Multilinestring ;-)

Je fais tourner le reste du code et normalement c bon.

Merci encore.

Hors ligne

 

Pied de page des forums

Powered by FluxBB